UIButton无法正确调整iPhone 4/5屏幕尺寸的文本大小。 (使用intrinsicContentSize)

时间:2016-07-14 10:59:00

标签: ios swift uiview uibutton

我在xib中设置了UIView,其中有四个按钮。文本左对齐,所有这些内容的左边缘内容插图设置为20。限制可以在下面看到:

enter image description here

对于iPhone 4和5的宽度,xib的宽度设置为320.当此视图添加到视图控制器时,我将框架的宽度设置为与当前屏幕尺寸相同,例如iPhone6和按钮将水平拉伸。现在,当我设置标题文本时,我希望按钮的高度增加以容纳文本。

我将UIButton子类化并覆盖了这个方法:

override func intrinsicContentSize() -> CGSize {

        let labelSize = titleLabel?.sizeThatFits(CGSizeMake(self.frame.size.width, CGFloat.max)) ?? CGSizeZero
        let desiredButtonSize = CGSizeMake(labelSize.width + titleEdgeInsets.left + titleEdgeInsets.right, labelSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom)
        return desiredButtonSize
    }

然后根据需要设置标题标签。对于iPhone6及以上版本,它可以完美运行:

enter image description here

然而,对于iPhone 4或5,我得到了这个结果:

enter image description here

任何想法我可能在这方面做错了什么?真的很感激一些指针。谢谢!

1 个答案:

答案 0 :(得分:1)

我不认为您想使用按钮的框架来确定标题的大小。你想使用标题的框架。 titleLabel?.sizeThatFits(CGSizeMake(self.frame.size.width, CGFloat.max))将确定标签的高度,就像标签宽度是按钮框架的整体一样。但是你有一个插页不允许标题以这种方式布局,所以它正在估计高度。这是你的标签溢出按钮边界的方式。它应该是:

    override func intrinsicContentSize() -> CGSize {

        let labelSize = titleLabel?.sizeThatFits(CGSizeMake((self.titleLabel?.frame.size.width)!, CGFloat.max)) ?? CGSizeZero
        let desiredButtonSize = CGSizeMake(labelSize.width + titleEdgeInsets.left + titleEdgeInsets.right, labelSize.height + titleEdgeInsets.top + titleEdgeInsets.bottom)
        return desiredButtonSize
    }

修改

根据您的限制,您可能还需要

override func layoutSubviews() { 
    super.layoutSubviews() self.titleLabel?.preferredMaxLayoutWidth = self.frame.size.width 
}