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


一个简单的iPhone应用程序 我显示一个字母瓷砖(自定义 UIView 通过以下代码获得图像和2个标签) viewDidLoad中

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

然后为了 image 和 letter 我在父级的左边,顶边,右边和底边添加了约束。

为了 letter label我还将“Lines”设置为0,将“Content Compression Resistance Priority”设置为1000(此处为 全屏1 和 全屏2):

Xcode screenshot

Xcode screenshot

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

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

结果如下:

app screenshot

两个背景 image 和 letter 标签似乎已按预期增长。

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

我四处寻找,我认为我需要类似的东西 tile.letter.adjustsFontSizeToFitWidth = YES。但与此同时我无法使用“自动布局”...

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

更新:

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

Xcode screenshot

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

另一个问题 如果有可能设置 adjustsFontSizeToFitWidth 在Interface Builder中的某个地方还是我必须使用源代码?我尝试在“用户定义的运行时属性”中添加一个键 - 但随后应用程序在运行时崩溃:

Xcode screenshot


23
2018-03-27 13:16


起源


您也应该为其他标签设置约束。 - vin
但你的另一个标签似乎放错了地方,你想要那样吗? - vin
我稍后会更正另一个标签的位置。现在我问的是字体大小。 - Alexander Farber
你在看什么尺码?如果你大规模地光栅化标签层,你可以很容易地用很少的工作来达到这个效果。 - Leo Natan
实际上我通过调整所有图形资源来解决我的问题。但感谢您的建议。 - Alexander Farber


答案:


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

 如果你设置足够大的字体大小(比如200)并设置 adjustsFontSizeToFitWidth 至 YES,我想你会得到有趣的有价值的结果。

别忘了设置 Baseline 如 Align Centers,否则你的文字可能看不清楚。

请告知我们您的结果。


26
2018-03-28 00:19



这就是我一直在做的事情,它在较小的屏幕上创建了太多空间。但是,我完全跳过了 Align centers  正如你所描述的那样,这对我的问题有帮助,因为我只是用标题来做这件事。谢谢! - RoLYroLLs


对于那些以标题来到这里需要的人 简单解决方案 (后 小时 调查):

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

解: 在Interface Builder中,

  1. “自动收缩”到“最小字体大小” 并设置大小的东西(它影响太宽的文本,但我们的解决方案需要)。
  2. “行”为0,并使字体大小 高于你在iPad中获得的帧数

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


14
2018-02-02 03:19



谢谢!将线设置为0是缺少的部分,以使其根据需要进行缩放。我不明白为什么这不起作用。 - rmvz3


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


2
2018-05-05 19:11





您可以使用自己的派生类替换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)
    }
}

从现在开始,你只需要更换 的UILabel 上课 MYLabel 在里面 身份检查员 IB和您的所有字体会根据您的设备高度自动调整大小。

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

let screenBounds = UIScreen.mainScreen().bounds

let screenBounds = self.bounds.height

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


1
2018-06-11 10:07





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


0
2018-03-27 19:54



这不是真的。看下面的答案。 - ishahak