如何在SWIFT中将文本视图的高度调整为其内容?

在我的视图控制器中,我有一个UITextView。 这个textview是填充一个string。 string可以是短或长。 根据string的长度,textview的高度必须调整。 我使用故事板和自动布局。

我对textview的高度有一些麻烦。

有时,高度是完全适应文本。 有时,不,文本在第一行被裁剪。 下面,textview是黄色的。 蓝色是scrollview内的容器视图。 紫色是一个图片的地方。

TITLE1标题2

这些文本来自我的核心数据库,它们是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的可滚动。 两个选项:

  1. 取消选中.xib中的“滚动已启用”。
  2. [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和更高版本(也确保“显式”未选中“首选宽度”属性的所有标签的宽度调整为不同的大小类)所有标签 – 完美的作品。