放置在superview(UITextView)中时,子视​​图(UILabel)不尊重约束

时间:2018-03-09 18:23:46

标签: ios uilabel uitextview

我在UITextView"中尝试了我自己的"占位符实施

我的方法是:

我在UILabel子类中创建UITextView,并设置UILabel的约束以匹配其超级视图的大小(UITextView)。

这是我创建UILabel并将其分配给placeholderLabel中名为awakeFromNib()的类变量的代码:

placeholderLabel = UILabel()
placeholderLabel.text = placeholder
placeholderLabel.numberOfLines = 0
placeholderLabel.lineBreakMode = .byWordWrapping
placeholderLabel.textAlignment = .left

以下代码是我将UILabel添加为子视图的位置,我再次在awakeFromNib()中设置了约束:

placeholderLabel.translatesAutoresizingMaskIntoConstraints = false
placeholderLabel.leftAnchor.constraint(equalTo: leftAnchor, constant: textContainerInset.left + 4).isActive = true
placeholderLabel.topAnchor.constraint(equalTo: topAnchor, constant: textContainerInset.top).isActive = true
placeholderLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: textContainerInset.right + 4).isActive = true
placeholderLabel.bottomAnchor.constraint(lessThanOrEqualTo: bottomAnchor, constant: textContainerInset.bottom).isActive = true

我还有一个属性,我在其中设置了占位符的文字,我有一个didSet观察者,用于设置placeholderLabel的文字,然后调用{{1} }以便在layoutIfNeeded()扩展到第二行(或第三行等)的情况下重新计算约束:

UILabel

问题是我有以下结果:

enter image description here

var placeholder: String = "" { didSet { placeholderLabel.text = placeholder layoutIfNeeded() } } 超出了它的超视图范围(向右),看起来它并不尊重约束。我运行可视化调试器这证实了同样的事情:

enter image description here enter image description here

似乎有一个宽度约束遵循UILabel的内容宽度而不是遵循我已设置的约束(在这种情况下它创建宽度为431而superview的宽度是288

有什么我想念的吗?

2 个答案:

答案 0 :(得分:1)

首先,您必须为正确约束的常量使用负值(或 - 使用正值 - 切换项placeholderLabel.rightAnchor / rightAnchor)。

但真正的问题是UITextViewUIScrollView的子类。在您的情况下,将UILabel添加大文本作为子视图并将其边缘约束到textview的边缘会导致textview的contentSize增长。 textview变为可水平滚动。

在添加标签之前和之后打印textview的contentSize会产生不同的宽度值(之前:335.0,之后:505.0)。

证明:https://www.dropbox.com/s/eogvl2c5r76c6cl/example.mov?dl=0

您可以通过不创建正确但宽度约束来解决该问题:

// placeholderLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -(textContainerInset.right + 4)).isActive = true
placeholderLabel.widthAnchor.constraint(equalTo: widthAnchor, constant: -(textContainerInset.left + 4 + textContainerInset.right + 4)).isActive = true

答案 1 :(得分:0)

右边应该是负数

placeholderLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: - textContainerInset.right - 4).isActive = true