我已经看到了涉及自动布局的垂直大小调整的答案,但我正在创建的UILabels仅在运行时需要. (我可能需要零到多个这些标签.)
示例(忽略颜色)
>短文本(注意与较长文本相同的宽度):
>更长的文本(注意与较短文本示例相同的宽度,并且添加更多行的文本):
如果文本可以适合固定宽度的一行,则标签不需要垂直调整大小.但是如果有更多字符,标签应该保持垂直扩展以适应这些附加字符.文本应该一行一行地包裹.文本应从标签的左上角开始.
更具体:
let marker = GMSMarker(position: myLatLng) // see https://stackoverflow.com/a/40211383/1168364 for imageWithView marker.icon = imageWithView(label) // **how do i create this label?** marker.map = map // map is a GMSMapView
解决方法
UIView有两种有用的方法:
sizeToFit()和
sizeThatFits(_:)
第一个将视图调整为最小尺寸以适合子视图的内容,第二个视图根本不更改帧,但返回计算的大小:(1)适合所有子视图和(2)不超过参数大小
所以你可以使用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) }
输出: