将带有程序约束的UILabel作为子视图添加到UITextView时,如何停止“内容大小”约束

时间:2019-05-13 17:30:16

标签: ios swift autolayout uitextview ios-autolayout

我有这种UIVIew扩展方法

func addSubviewWithConstrainedBounds(subview:UIView) {
    subview.translatesAutoresizingMaskIntoConstraints = false
    self.addSubview(subview)
    NSLayoutConstraint.activate([
        subview.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 0),
        subview.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0),
        subview.topAnchor.constraint(equalTo: self.topAnchor, constant: 0),
        subview.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0),
    ])
}

这样的想法是,我可以通过编程方式将视图添加到另一个视图中,在这里我将利用自动布局将子视图的边界与超级视图相匹配

当我调用此命令将我的subview添加到UIView超级视图时,它起作用了

但是,当我尝试将我的subview添加到UITextView超级视图时,subview坚持要从“内容”中获取一些widthheight约束尺寸”。如您所见,我的尾部约束和底部约束都被忽略了(控制台中也没有例外)

enter image description here

为进行比较,以下是将UILabel而不是UIView添加到UITextView时的运行时约束

enter image description here

我可能在这里缺少财产吗?我需要设置的东西?还是只是尝试向UITextView添加子视图的怪癖?

1 个答案:

答案 0 :(得分:1)

此行为背后的原因是UITextView是UIScrollView。这意味着,如果子视图没有高度/宽度,则布局不明确,因此布局引擎会添加固有尺寸来解决该问题。

这取决于您要在文本视图中放置子视图的方式或位置,在这种情况下,您需要更具体地说明对齐方式。如果有帮助,请查看内容优先级选项。

但是最终,我认为如果可以使用TextKit的功能来在文本视图中对计划标签的内容进行样式设置和放置,最好不要添加标签作为子视图。