使字体与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并启用“自动布局”。

然后,对于imageletter我将限制添加到父级的左侧,顶部,右侧,底部边缘。

对于letter标签,我还将“Lines”设置为0,将“Content Compression Resistance Priority”设置为1000(这里是全屏幕1和全屏幕2 ):

Xcode截图

Xcode截图

然后我修改代码使用更大的宽度和高度:

 tile.frame = CGRectMake(10 + arc4random_uniform(100), 10 + arc4random_uniform(100), 2 * kWidth, 2 * kHeight); 

结果如下:

应用截图

背景imageletter标签似乎都是按照预期成长的。

然而,标签的字体大小还没有增长。

我周围search,我认为我需要像tile.letter.adjustsFontSizeToFitWidth = YES 。 但同时我不能使用“自动布局”正在…

所以我的问题是,如果在“Interface Builder”中有任何选项可以使字体大小增长?

更新:

我试过ismailgulek的build议,在界面生成器和代码中设置字体大小为200 tile.letter.adjustsFontSizeToFitWidth = YES ,它看起来很有前途(这里全屏 ):

Xcode截图

但是现在我已经在Interface Builder中将40px设置为letter.bottom约束了。 但是如果我需要更大的瓷砖框架呢? 有没有一种方法可以在该约束中使用百分比而不是绝对像素值?

另一个问题是,如果可以在Interface Builder的某处设置adjustsFontSizeToFitWidth ,还是必须使用源代码? 我试着给“用户定义的运行时属性”添加一个键 – 但是在运行时崩溃了:

Xcode截图

UILabel adjustsFontSizeToFitWidth属性不会长大字体大小,只能根据文档来缩小:通常情况下,标签文本是用您在font属性中指定的字体绘制的。 但是,如果此属性设置为YES ,并且text属性中的文本超出了标签的边界矩形,接收器将开始缩小字体大小,直到string适合或达到最小字体大小。

但是,如果你设置的字体大小足够大(比如说200)并将adjustsFontSizeToFitWidth设置为YES ,那么我认为你会得到有趣的有价值的结果。

不要忘记将Baseline设置为Align Centers ,否则文字可能无法正确显示。

请告知我们您的结果。

对于那些标题来到这里的人,需要一个简单的解决scheme (经过几个小时的调查):

问题示例:如果使用自动布局,并将UILabel高度设置为与屏幕高度成比例,则会得到iPhone(横向)较低,iPad较高的帧。 如何自动调整字体高度?

解决scheme:在Interface Builder中,

  1. “自动缩放”设置为“最小字体大小”并设置大小(这会影响文本太宽,但对于我们的解决scheme是必需的)。
  2. 设置“线”为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或编程。