我已经看到了涉及自动布局的垂直大小调整的答案,但{I}创建的UILabel
仅在运行时需要。 (我可能需要从0到很多这些标签的任何地方。)
示例(忽略颜色)
如果文本可以适合固定宽度的一行,则标签不需要垂直调整大小。但是如果有更多字符,标签应该保持垂直扩展以适应这些附加字符。文本应该一行一行地包裹。文本应从标签的左上角开始。
更具体一点:
let marker = GMSMarker(position: myLatLng)
// see http://stackoverflow.com/a/40211383/1168364 for imageWithView
marker.icon = imageWithView(label) // **how do i create this label?**
marker.map = map // map is a GMSMapView
这些标签可以在屏幕上的任何位置。这适用于地图应用程序,其中每个标签将放置在随机位置。标签'地点之间没有任何关系。
答案 0 :(得分:11)
UIView有两种有用的方法: sizeToFit() 和 sizeThatFits(_:)
第一个将视图调整为最小尺寸以适合子视图'内容和第二个内容根本不会改变帧,但会返回计算出的大小:(1)适合所有子视图,(2)不超过参数size
因此,您可以使用 sizeThatFits
:
let label = UILabel()
override func viewDidLoad() {
super.viewDidLoad()
label.backgroundColor = UIColor.orange
label.textColor = UIColor.white
// label.text = "ultimate Frisbee"
label.text = "ultimate Frisbee\nin 3 minutes,\nall welcome|2"
label.numberOfLines = 10
view.addSubview(label)
updateLabelFrame()
}
func updateLabelFrame() {
let maxSize = CGSize(width: 150, height: 300)
let size = label.sizeThatFits(maxSize)
label.frame = CGRect(origin: CGPoint(x: 100, y: 100), size: size)
}
<强>输出:强>
P.S。您也可以使用autolayout约束来解决您的问题,但我不是以编程方式使用它们的忠实粉丝。
答案 1 :(得分:1)
将标签的numberOfLines
属性设置为零,并使用约束来固定标签的宽度(通过明确约束宽度或将前沿和后边缘约束到其他视图,如标签&# 39;超级视图)。然后标签将自动垂直调整到适合文本的高度。您需要通过其顶部约束来固定一个标签,以便视图系统知道从哪里开始布局,然后所有其他标签的顶部应该被约束到前一个标签的底部。这样,它们将相对于前一个标签的高度进行布局。
根据您的评论进行修改:
您可以使用widthAnchor
属性在iOS 9及更高版本上显式设置视图的宽度。您可以使用NSLayoutConstraints
在旧版iOS上进行设置(例如,搜索SO)。
e.g:
label.widthAnchor.constraintEqualToConstant(50.0).active = true
这会将标签的宽度设置为50点宽,但不会修正其高度,因此使用numberOfLines = 0
时,标签会在您设置文本时垂直自动调整大小。