在UIStackView内部放置UITextView

21

我将UITextView放在了UIStackView中。

但是我的文本视图不是多行的。

自动布局如下所示:

enter image description here

根据图片,它只占用了一行。文本视图框架按照图片中显示的超出了边框。

UITextView

enter image description here enter image description here

UIStackView

enter image description here


那么,问题是什么? - Ketan Parmar
@Lion,它应该显示为多行吗? - user2526811
3个回答

51
只要您的堆栈视图被良好约束,如果在UITextView上设置isScrollEnabledfalse,它就可以在堆栈视图内自行调整大小。

干杯!这是一个巨大的项目。 - Womble
@Womble 很高兴能帮忙!我猜那也很及时。 - Clay Ellis
6
谢谢你,你帮助我又度过了一天没有自我怀疑的情绪。 - Tim J
1
你所说的“well-constrained”是指没有固定高度或顶部或底部约束的约束吗?(也许只有顶部或底部而不是两者都有?) - user11638666
1
谢谢你的帮助,Clay。然而我发现,在iOS 16上,如果我们将UITextView的isScrollEnabled属性设置为false,应用程序会崩溃...一个解决方法是在UITextView委托的textViewDidBeginEditing方法中将其设置为true,并在textViewDidEndEditing方法中将其设置回false。 - NhlanhlaNkosi

30

问题在于您通过给topbottom约束来固定UIStackView的高度。

  1. 删除bottom约束

    enter image description here

禁用TextView滚动。

将您的TextView委托给自己并实现textViewDidChange方法。

Swift

func textViewDidChange(_ textView: UITextView) {
    view.layoutIfNeeded()
}

Objective C:

-(void)textViewDidChange:(UITextView *)textView {
    [self.view layoutIfNeeded];
}

确保调用此方法。

现在,您的 stackview 应该随着文本视图而多行增长。

您的文本视图不是多行的原因是因为您已经固定了高度。因此,它永远不会成为多行文本。

请参阅 GIF:

输入图像描述


1
太好了!如果你有静态文本,我发现如果你重写viewDidLayoutSubviews(),你可以在那里获取内容高度并更新高度约束。但是你的答案让我走上了正确的道路!override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() textViewHeightConstraint.constant = textView.contentSize.height textView.layoutIfNeeded() } - David H
2
如果堆栈视图不是最后一个视图怎么办?例如,您不能删除底部约束,因为您需要与较低位置的视图保持间距。 - Teodor Ciuraru
@TeodorCiuraru,如果stackview不是最后一个视图,则必须为下一个视图提供垂直间距。您必须以这样的方式进行操作,使得下一个视图向下移动或缩小高度以为此视图腾出空间(下一个视图不应具有底部约束或固定高度)。 - Irfan
1
@Irfan 似乎我运气不太好。我需要在最后一个视图上设置底部约束。幸运的是,我通过将其从堆栈视图中取消嵌入并随意推动压缩优先级按钮来解决了这个问题 :)) - Teodor Ciuraru
如果您想让textView滚动怎么办? - ArielSD

0
到目前为止,我发现解决这个问题的最佳方法是将UITextView包装在UIView中,然后使用高度锚定设置UITextView的固定高度。
let textView = UITextView()
let containerView = UIView()
textView.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(textView)

textView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor).isActive = true
textView.topAnchor.constraint(equalTo: containerView.topAnchor).isActive = true
textView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor).isActive = true
textView.bottomAnchor.constraint(equalTo: containerView.bottomAnchor).isActive = true

textView.heightAnchor.constraint(equalToConstant: 100).isActive = true
let stackView = UIStackView(arrangedSubviews: [containerView])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接