使字体与UILabel一起增长(通过自动布局调整大小) - 如何在Interface Builder中执行此操作?

时间:2014-03-27 13:16:35

标签: ios interface-builder uilabel sizetofit

a simple iPhone app中,我在viewDidLoad中通过以下代码显示字母图块(自定义UIView带有图片和2个标签):

app screenshot

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 Interface Builder中,我打开DraggedTile.xib并启用"自动布局"。

然后,对于imageletter,我会在父级的左边,顶边,右边和底边添加约束。

对于letter标签,我还设置了" Lines"到0和"内容压缩阻力优先"到1000(此处fullscreen 1fullscreen 2):

Xcode screenshot

Xcode screenshot

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

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

结果如下:

app screenshot

背景imageletter标签似乎都按预期增长。

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

我已经四处寻找,我认为我需要像tile.letter.adjustsFontSizeToFitWidth = YES这样的东西。但与此同时,我不能将它用于"自动布局"正在......

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

更新

我已经尝试过ismailgulek建议在Interface Builder和in the code tile.letter.adjustsFontSizeToFitWidth = YES中将字体大小设置为200,看起来很有前途(这里fullscreen):< / p>

Xcode screenshot

但我现在遇到的问题是我在Interface Builder中将40px设置为letter.bottom约束。但是,如果我需要更大的瓷砖框架怎么办?有没有办法在该约束中使用百分比而不是绝对像素值?

另一个问题是否可以在Interface Builder中的某处设置adjustsFontSizeToFitWidth,或者我是否必须使用源代码?我已经尝试在&#34;用户定义的运行时属性&#34;中添加一个密钥。 - 然后应用程序在运行时崩溃:

Xcode screenshot

6 个答案:

答案 0 :(得分:26)

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

如果您将字体大小设置得足够大(比如200)并将YES设置为adjustsFontSizeToFitWidth,我认为您会获得有趣的宝贵结果。

并且不要忘记将YES设置为Baseline,否则您的文字可能无法正常显示。

请告知我们您的结果。

答案 1 :(得分:14)

对于那些来到这里并且需要简单解决方案(在小时调查之后)的人:

问题示例:如果您使用自动布局并将UILabel高度设置为与屏幕高度成比例,那么您将获得一个低于iPhone(横向)和iPad高的帧。如何自动调整字体高度?

Interface Builder中的

解决方案

  1. 设置&#34;自动收缩&#34;到&#34;最小字体大小&#34; 并为大小设置一些东西(它影响太宽的文本,但我们的解决方案需要)。
  2. 设置&#34;行&#34;为0 ,并使字体高于您在iPad中获得的帧
  3. 这会导致字体自动增加到当前高度。

答案 2 :(得分:2)

您可以通过在故事板中设置自动收缩来完成您想要的任务。当屏幕尺寸变小时,它将使标签缩小到最小刻度/显式尺寸。使其在最大的屏幕尺寸上工作,然后确保它缩小到故事板预览中所需的大小。

答案 3 :(得分:1)

您可以将Interface Builder中的类替换为您自己的派生类,并在那里调整大小。

示例:

/**
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的身份检查器中用 MYLabel 替换 UILabel 类,所有字体都会按比例自动调整大小到您的设备高度。

如果您想将其与标签尺寸一起增长,请替换

let screenBounds = UIScreen.mainScreen().bounds

let screenBounds = self.bounds.height

或任何其他自定义比例公式。 UIFont 为您提供了额外的测量属性,您可以使用此方法做很多事情。

答案 4 :(得分:1)

还要确保将“换行”从“自动换行”设置为“截尾”。

答案 5 :(得分:0)

字体不会自动增长。
你应该自己,IB或以编程方式增加/减少它。