ios - UIButton 无法针对 iPhone 4/5 屏幕尺寸正确调整文本大小。 (使用内在内容大小)

标签 ios swift uiview uibutton

我在 xib 中有一个 UIView 设置,里面有四个按钮。文本左对齐,所有内容的左边缘内容插图设置为 20。约束如下所示:

enter image description here

对于 iPhone 4 和 5 的宽度,xib 的宽度设置为 320。当这个 View 被添加到 View Controller 时,我使框架的宽度与当前屏幕尺寸相同,例如iPhone6 和按钮会水平拉伸(stretch)。现在,当我设置标题文本时,我希望按钮的高度增加以容纳文本。

我子类化了 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

知道我在这方面可能做错了什么吗?非常感谢一些指点。谢谢!

最佳答案

我认为您不想使用按钮的框架来确定标题适合的大小。你想使用标题的框架。 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 
}

关于ios - UIButton 无法针对 iPhone 4/5 屏幕尺寸正确调整文本大小。 (使用内在内容大小),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38372415/

相关文章:

ios - 在 View Controller 之间传递数据

ios - 如何单击控制中心中的按钮?

ios - 无法在 Xcode 9.1 上单击或拖动 Connections Inspector 的项目到 View Controller

iphone - 渲染 UIView 及其子级

ios - 快速更改图像选择器首选状态栏样式

ios - 为什么我的代码向后运行?或者看起来是这样?

ios - Xcode UI 未使用最新的 Firebase 值进行更新

iphone - 从静态库访问 self.view

iOS - 在屏幕中央显示进度指示器而不是 View

ios - 等待多个 block 完成