如何在SWIFT中将文本视图的高度调整为其内容?
在我的视图控制器中,我有一个UITextView。 这个textview是填充一个string。 string可以是短或长。 根据string的长度,textview的高度必须调整。 我使用故事板和自动布局。
我对textview的高度有一些麻烦。
有时,高度是完全适应文本。 有时,不,文本在第一行被裁剪。 下面,textview是黄色的。 蓝色是scrollview内的容器视图。 紫色是一个图片的地方。
这些文本来自我的核心数据库,它们是string属性。 在屏幕1和2之间,唯一改变的是string。
如果我在控制台打印string,我有正确的文本:
my amazing new title Another funny title for demo
我的textview的限制:
我不明白为什么我有两个不同的显示器。
编辑
我尝试了@Nate的build议,在viewDidLoad,我补充说:
myTextViewTitle.text="my amazing new title" myTextViewTitle.setContentHuggingPriority(1000, forAxis: UILayoutConstraintAxis.Vertical) myTextViewTitle.setContentCompressionResistancePriority(1000, forAxis: UILayoutConstraintAxis.Vertical) myTextViewTitle.setTranslatesAutoresizingMaskIntoConstraints(false) let views = ["new_view": myTextViewTitle] var constrs = NSLayoutConstraint.constraintsWithVisualFormat("|-8-[new_view]-8-|", options: NSLayoutFormatOptions(0), metrics: nil, views: views) self.view.addConstraints(constrs) self.view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-8-[new_view]", options: NSLayoutFormatOptions(0), metrics: nil, views: views)) self.myTextViewTitle.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[new_view(220@300)]", options: NSLayoutFormatOptions(0), metrics: nil, views: views))
没有结果。 有或没有高度限制添加我的界面生成器中的textview …
编辑2
我需要一个UITextView,而不是一个UIlabel,因为后退button,使用排除path。
let exclusionPathBack:UIBezierPath = UIBezierPath(rect: CGRect(x:backButton.bounds.origin.x, y:backButton.bounds.origin.y, width:backButton.bounds.width+10, height:backButton.bounds.height)) myTextViewTitle.textContainer.exclusionPaths=[exclusionPathBack]
我find了解决scheme。
我专注于UITextView的高度,然后看了一篇关于纵横比的文章。 我想尝试,这工作!
所以在故事板中,我为textview添加了纵横比,并且选中了“在构build时移除”选项。
在viewDidLayoutSubviews()中,我写道:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let contentSize = self.myTextViewTitle.sizeThatFits(self.myTextViewTitle.bounds.size) var frame = self.myTextViewTitle.frame frame.size.height = contentSize.height self.myTextViewTitle.frame = frame aspectRatioTextViewConstraint = NSLayoutConstraint(item: self.myTextViewTitle, attribute: .Height, relatedBy: .Equal, toItem: self.myTextViewTitle, attribute: .Width, multiplier: myTextViewTitle.bounds.height/myTextViewTitle.bounds.width, constant: 1) self.myTextViewTitle.addConstraint(aspectRatioTextViewConstraint!) }
它完美的作品。
首先,禁用UITextView的可滚动。 两个选项:
- 取消选中.xib中的“滚动已启用”。
- [TextView setScrollEnabled:NO];
创build一个UITextView并将其与IBOutlet(TextView)连接。 添加一个默认高度的UITextView高度约束,将其与IBOutlet(TextViewHeightConstraint)连接起来。 当你asynchronous设置你的UITextView的文本时,你应该计算UITextView的高度,并设置UITextView的高度约束。 示例代码:
CGSize sizeThatFitsTextView = [TextView sizeThatFits:CGSizeMake(TextView.frame.size.width, MAXFLOAT)]; TextViewHeightConstraint.constant = sizeThatFitsTextView.height;
在快速2.3:
func textViewDidChange(textView: UITextView) { let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.max)) if size.height != TXV_Height.constant && size.height > textView.frame.size.height{ TXV_Height.constant = size.height textView.setContentOffset(CGPointZero, animated: false) } }
在Swift 3.0中,其中tvHeightConstraint是主题TextView的高度约束(如果用于多个文本视图,则将其添加到函数input中):
func textViewDidChange(textView: UITextView) { let size = textView.sizeThatFits(CGSize(width: textView.frame.size.width, height: CGFloat.greatestFiniteMagnitude)) if size.height != tvHeightConstraint.constant && size.height > textView.frame.size.height{ tvHeightConstraint.constant = size.height textView.setContentOffset(CGPoint.zero, animated: false) } }
H / T to @cmi和@Pablo Ruan
为什么没有图像的后退button和UILabel为您的文字,并使用自动布局来定位它们? 也许第三个视图为黄色背景。
我简单的解决一个非常类似的问题:
我使用的行数设置为0的标签,而不是尝试使用文本字段或视图。 然后我把前缘和后缘剪裁到标签的容器上,这些容器在我的情况下限制它们的宽度,0作为约束的常量。 问题是将行数设置为0,以允许标签根据其内容增长或缩小。 文本永远不会被切碎,标签的高度永远不会超过它的内容“我为宽度(在我的情况下的容器宽度)configuration的所有不同的大小类。 testingIOS 8.0和更高版本(也确保“显式”未选中“首选宽度”属性的所有标签的宽度调整为不同的大小类)所有标签 – 完美的作品。