swift:以编程方式创建UILabel固定宽度,根据文本长度垂直resize

我已经看到了涉及自动布局的垂直大小调整的答案,但我正在创建的UILabel仅在运行时需要。 (我可能需要零到多个这些标签。)

示例(忽略颜色)

  1. 短文本(注意与较长文本相同的宽度):

在此处输入图像描述

  1. 较长的文本(注意与较短的文本示例相同的宽度,并且有更多的行用于add’l文本):

在此处输入图像描述

如果文本可以适合固定宽度的一行,则标签不需要垂直resize。 但是如果有更多字符,标签应该保持垂直扩展以适应这些附加字符。 文本应该一行一行地包裹。 文本应从标签的左上角开始。

更具体:

 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 

这些标签可以在屏幕上的任何位置。 这适用于地图应用程序,其中每个标签将放置在随机位置。 标签的位置彼此没有关系。

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) } 

输出:

在此处输入图像描述 在此处输入图像描述

PS你也可以通过自动布局约束解决你的问题,但我不是以编程方式使用它们的忠实粉丝。

将标签的numberOfLines属性设置为零,并使用约束来固定标签的宽度(通过明确约束宽度或通过将前沿和后缘约束到某个其他视图(如标签的超视图))。 然后标签将自动垂直调整到适合文本的高度。 您需要通过其顶部约束固定一个标签,以便视图系统知道从哪里开始布局,然后所有其他标签的顶部应该被约束到前一个标签的底部。 这样,它们将相对于前一个标签的高度进行布局。

编辑以回应您的评论:

您可以使用widthAnchor属性在iOS 9及更高版本上显式设置视图的宽度。 您可以使用NSLayoutConstraints在旧版iOS上进行NSLayoutConstraints (例如,搜索SO)。

例如:

label.widthAnchor.constraintEqualToConstant(50.0).active = true

这会将标签的宽度设置为50点宽,但不能确定其高度,因此使用numberOfLines = 0 ,标签将在您设置文本时垂直自动resize。