ios - 在 Swift 中随着文本大小的增加而增加按钮的高度
问题描述
我对自动布局很陌生,我一直在努力解决一件事。
在- 我试图根据文本大小增加它的高度Roll btn
。BottomView
如您所见,textlabel
btn 的高度在增加,但 btn的高度height
没有。
constraints
我申请的:
1)Horizontallly
并verticallly
以superview为中心
2)Leading
和trailing
来自superview
3)我尝试将高度约束也设置greaterThanEqualTo
为constant
。但这没有用
4)我也试过了SizeToFit
。没用
5)我已将链接设置lineBreak
为0。仍然无法正常WordWrap
工作number of lines
titleLabel
解决方案
当您修改.titleLabel
aUIButton
时,自动布局不会考虑您的更改。
要获得正确自动调整大小的多行按钮,您需要对其进行子类化并返回一个有效的.intrinsicContentSize
.
这是一个简单的例子:
@IBDesignable
class MultilineButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
override func prepareForInterfaceBuilder() {
super.prepareForInterfaceBuilder()
commonInit()
setNeedsLayout()
}
func commonInit() -> Void {
self.titleLabel?.numberOfLines = 0
self.titleLabel?.textAlignment = .center
self.contentEdgeInsets = UIEdgeInsets(top: 8.0, left: 8.0, bottom: 8.0, right: 8.0)
}
override var intrinsicContentSize: CGSize {
let size = self.titleLabel!.intrinsicContentSize
return CGSize(width: size.width + contentEdgeInsets.left + contentEdgeInsets.right, height: size.height + contentEdgeInsets.top + contentEdgeInsets.bottom)
}
override func layoutSubviews() {
super.layoutSubviews()
titleLabel?.preferredMaxLayoutWidth = self.titleLabel!.frame.size.width
}
}
该类已标记@IBDesignable
,因此您可以在 Storyboard / Interface Builder 中使用它以获得准确的结果。
这是此按钮的 3 个实例的外观(在 Storyboard 中)。首先是一个简短的标题,所以它不需要换行;下一个带有换行的标题;第三个带有嵌入换行符的标题:
请注意,此示例Content Edge Insets
在所有 4 条边上明确地将 设置为 8-pts。如果您希望能够为单个按钮更改它,则需要进行一些编辑。
推荐阅读
- python - ValueError:arange:无法计算长度
- python - 网站不允许网络抓取 - 如何解决?
- html - Google Script onOpen 函数(从第一个链接,显示第二个链接,然后返回第一个链接。)
- python - 识别唯一标识 pandas DataFrame 行的最小列子集
- gitlab - GitLab CI - 如何同步两个单独的跑步者?
- python - 替代 if __name__ == '__main__':
- c++ - wxWidgets 提示动态复选框列表
- flutter - Flutter web 在部署 web 应用程序时使用 singleChildScrollView 显示空白
- c# - 优雅的 Win32 无窗口进程终止
- mysql - 需要 sql 查询来查找层次结构中最低级别的值