24

一个简单的 iPhone 应用程序中,我通过viewDidLoad中的以下代码显示一个字母图块(UIView带有图像和 2 个标签的自定义):

应用截图

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,将“Content Compression Resistance Priority”设置为 1000(此处为fullscreen 1fullscreen 2):

Xcode 截图

Xcode 截图

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

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

结果如下:

应用截图

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

但是标签的字体大小并没有增加。

我四处搜索,我认为我需要类似tile.letter.adjustsFontSizeToFitWidth = YES. 但同时我不能在“自动布局”开启的情况下使用它......

所以我的问题是“界面生成器”中是否有任何选项可以使字体大小也增加?

更新:

我已经尝试过 ismailgulek 的建议,即在 Interface Builder 和代码 tile.letter.adjustsFontSizeToFitWidth = YES中将字体大小设置为 200 ,它看起来很有希望(这里是fullscreen):

Xcode 截图

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

另一个问题是是否可以adjustsFontSizeToFitWidth在 Interface Builder 中设置某处,或者我是否必须为此使用源代码?我尝试向“用户定义的运行时属性”添加一个键 - 但随后应用程序在运行时崩溃:

Xcode 截图

4

6 回答 6

27

adjustsFontSizeToFitWidth的属性UILabel不会增加字体大小,它只是根据文档缩小:通常,标签文本是用font您在字体属性中指定的。但是,如果此属性设置为YES,并且 text 属性中的文本超出标签的边界矩形,则接收器开始减小字体大小,直到字符串适合或达到最小字体大小。

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

并且不要忘记设置BaselineAlign Centers,否则您的文本可能无法正常显示。

请告知我们您的结果。

于 2014-03-28T00:19:48.840 回答
14

对于那些按标题来到这里并需要一个简单解决方案的人(经过数小时的调查):

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

解决方案:在 Interface Builder 中,

  1. “Autoshrink”设置为“Minimum font size”并设置一些大小(它会影响太宽的文本,但我们的解决方案需要)。
  2. "Lines" 设置为 0,并使字体大小高于您在 iPad 中获得的框架

这将导致字体自动增加到当前高度。

于 2016-02-02T03:19:02.083 回答
2

您可以通过在情节提要中设置 Autoshrink 来完成您想要的。当屏幕尺寸变小时,它会导致标签缩小到最小比例/显式尺寸。让它在最大的屏幕尺寸上工作,然后确保它在故事板预览中缩小到您想要的尺寸。

于 2015-05-05T19:11:48.027 回答
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 的身份检查器中将UILabel类替换为MYLabel ,您的所有字体都会自动根据您的设备高度按比例调整大小。

如果您只想将其与标签大小一起增长,请替换

let screenBounds = UIScreen.mainScreen().bounds

let screenBounds = self.bounds.height

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

于 2015-06-11T10:07:40.507 回答
1

还要确保将“换行符”从“Word Wrap”设置为“Truncate Tail”。</p>

于 2020-04-23T23:29:16.193 回答
0

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

于 2014-03-27T19:54:58.630 回答