使字体与UILabel(通过自动布局resize)一起增长 – 如何在Interface Builder中实现?
在一个简单的iPhone应用程序中,通过viewDidLoad中的以下代码显示一个字母拼贴(带有图像和2个标签的自定义UIView
):
DraggedTile *tile = [[[NSBundle mainBundle] loadNibNamed:@"DraggedTile" owner:self options:nil] firstObject]; tile.frame = CGRectMake(10 + arc4random_uniform(100), 10 + arc4random_uniform(100), kWidth, kHeight); [self.view addSubview:tile];
这工作正常,但我想使字母瓷砖生长 – 当我提供更大的宽度和高度参数的CGRectMake
。
所以在Xcode 5.1界面生成器中,我打开DraggedTile.xib
并启用“自动布局”。
然后,对于image
和letter
我将限制添加到父级的左侧,顶部,右侧,底部边缘。
对于letter
标签,我还将“Lines”设置为0,将“Content Compression Resistance Priority”设置为1000(这里是全屏幕1和全屏幕2 ):
然后我修改代码使用更大的宽度和高度:
tile.frame = CGRectMake(10 + arc4random_uniform(100), 10 + arc4random_uniform(100), 2 * kWidth, 2 * kHeight);
结果如下:
背景image
和letter
标签似乎都是按照预期成长的。
然而,标签的字体大小还没有增长。
我周围search,我认为我需要像tile.letter.adjustsFontSizeToFitWidth = YES
。 但同时我不能使用“自动布局”正在…
所以我的问题是,如果在“Interface Builder”中有任何选项可以使字体大小增长?
更新:
我试过ismailgulek的build议,在界面生成器和代码中设置字体大小为200 tile.letter.adjustsFontSizeToFitWidth = YES
,它看起来很有前途(这里全屏 ):
但是现在我已经在Interface Builder中将40px设置为letter.bottom
约束了。 但是如果我需要更大的瓷砖框架呢? 有没有一种方法可以在该约束中使用百分比而不是绝对像素值?
另一个问题是,如果可以在Interface Builder的某处设置adjustsFontSizeToFitWidth
,还是必须使用源代码? 我试着给“用户定义的运行时属性”添加一个键 – 但是在运行时崩溃了:
UILabel
adjustsFontSizeToFitWidth
属性不会长大字体大小,只能根据文档来缩小:通常情况下,标签文本是用您在font属性中指定的字体绘制的。 但是,如果此属性设置为YES
,并且text属性中的文本超出了标签的边界矩形,接收器将开始缩小字体大小,直到string适合或达到最小字体大小。
但是,如果你设置的字体大小足够大(比如说200)并将adjustsFontSizeToFitWidth
设置为YES
,那么我认为你会得到有趣的有价值的结果。
不要忘记将Baseline
设置为Align Centers
,否则文字可能无法正确显示。
请告知我们您的结果。
对于那些标题来到这里的人,需要一个简单的解决scheme (经过几个小时的调查):
问题示例:如果使用自动布局,并将UILabel高度设置为与屏幕高度成比例,则会得到iPhone(横向)较低,iPad较高的帧。 如何自动调整字体高度?
解决scheme:在Interface Builder中,
- 将“自动缩放”设置为“最小字体大小”并设置大小(这会影响文本太宽,但对于我们的解决scheme是必需的)。
- 设置“线”为0 ,并使字体大小高于你将在iPad中获得的框架 。
这将导致字体自动增加到当前的高度。
您可以通过在故事板中设置Autoshrink来完成您想要的操作。 当屏幕尺寸变小时,会导致标签缩小到最小尺寸/显示尺寸。 让它在最大的屏幕尺寸上工作,然后确保它在故事板预览中缩小到所需的大小。
您可以使用您自己的派生类来replaceInterface Builder中的类,并在其中resize。
例:
/** MYLabel does exactly the same like UILabel, except that the font size will automatically shrink if the code is executed on an iPhone. */ class MYLabel: UILabel { var onlyOnceToken: dispatch_once_t = 0 override func drawRect(rect: CGRect) { dispatch_once(&onlyOnceToken) { if let usedFont:UIFont = self.font { // define your reference size here let iPadHeight:CGFloat = 768 let screenBounds = UIScreen.mainScreen().bounds let scale:CGFloat = screenBounds.height / iPadHeight self.font = UIFont(name: usedFont.fontName, size: CGFloat(usedFont.pointSize) * scale) } } super.drawRect(rect) } }
从现在起,您只需要在IB的身份检查器中用MYLabelreplaceUILabel类,并且所有字体都会根据您的设备高度自动resize。
如果您只想将其与标签尺寸一起放大,请更换
let screenBounds = UIScreen.mainScreen().bounds
同
let screenBounds = self.bounds.height
或任何其他自定义比例公式。 UIFont为您提供了额外的测量属性,您可以使用这种方法做很多事情。
字体不会自动增长。
你应该自己增加/减less它,在IB或编程。