如何根据文本长度使UITextView高度动态?

Dey*_*een 52 uitextview ios swift

正如您在此图片中看到的那样

UITextView变化是根据文本长度的身高,我希望把它调整它是根据文本长度高度.

*我看到了其他问题,但那里的解决方案对我不起作用

例

Dey*_*een 107

这个作品对我来说,所有其他解决方案都没有.

func adjustUITextViewHeight(arg : UITextView)
{
    arg.translatesAutoresizingMaskIntoConstraints = true
    arg.sizeToFit()
    arg.scrollEnabled = false
}
Run Code Online (Sandbox Code Playgroud)

在Swift 4中,语法arg.scrollEnabled = false已更改为arg.isScrollEnabled = false.

  • 不适用于SwiftUI中的UIViewRespresentable (2认同)
  • 对于我的情况,只有 arg.sizeToFit() 就足够了。arg.translatesAutoresizingMaskIntoConstraints 删除了我的约束 (2认同)

Aka*_*ndu 35

我所要做的就是:

  1. 将约束设置为 textView 的顶部、左侧和右侧
  2. 在 Storyboard 中禁用滚动

这允许自动布局根据其内容动态调整 textView 的大小。

  • 干净整洁!!谢谢+1 (2认同)

Sam*_*yes 20

尝试一下:

CGRect frame = self.textView.frame;
frame.size.height = self.textView.contentSize.height;
self.textView.frame = frame;
Run Code Online (Sandbox Code Playgroud)

编辑 - 这是Swift:

var frame = self.textView.frame
frame.size.height = self.textView.contentSize.height
self.textView.frame = frame
Run Code Online (Sandbox Code Playgroud)


Tum*_*Tum 17

在Storyboard/Interface Builder中,只需在"属性"检查器中禁用滚动.

在代码中textField.isScrollEnabled = false应该做的伎俩.

  • 我不敢相信事情就这么简单。我认为这应该是公认的答案。 (3认同)

ZAF*_*007 14

斯威夫特4

将它添加到您的班级

UITextViewDelegate

func textViewDidChange(_ textView: UITextView) {
      let fixedWidth = textView.frame.size.width
      textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
      let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.greatestFiniteMagnitude))
      var newFrame = textView.frame
      newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
      textView.frame = newFrame
}
Run Code Online (Sandbox Code Playgroud)

  • `textView.translatesAutoresizingMaskIntoConstraints = true` 也是需要的 (2认同)

Ant*_*ong 10

Swift 5,使用扩展:

extension UITextView {
    func adjustUITextViewHeight() {
        self.translatesAutoresizingMaskIntoConstraints = true
        self.sizeToFit()
        self.isScrollEnabled = false
    }
}
Run Code Online (Sandbox Code Playgroud)

用例:

textView.adjustUITextViewHeight()
Run Code Online (Sandbox Code Playgroud)

并且不关心故事板中 texeView 的高度(首先使用常量)


Bra*_*ang 9

接下来是DeyaEldeen的回答.
就我而言.我通过添加自动增长textview高度

迅捷3

textView.translatesAutoresizingMaskIntoConstraints = false textView.isScrollEnabled = false


Ali*_*das 8

我添加了这两行代码,对我来说效果很好。

适用于 Swift 5+

func adjustUITextViewHeight(textView : UITextView)
{
     textView.translatesAutoresizingMaskIntoConstraints = true
     textView.isScrollEnabled = false
     textView.sizeToFit()
}
Run Code Online (Sandbox Code Playgroud)


Sha*_*yaz 5

以编程方式直接执行。只需按照以下步骤操作即可

  1. 将观察者添加到文本字段的内容长度

    [yourTextViewObject addObserver:self forKeyPath:@"contentSize" options:(NSKeyValueObservingOptionNew) context:NULL];
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实施观察者

    -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    UITextView *tv = object;
    
        //Center vertical alignment
        CGFloat topCorrect = ([tv bounds].size.height - [tv contentSize].height * [tv zoomScale])/2.0;
        topCorrect = ( topCorrect < 0.0 ? 0.0 : topCorrect );
        tv.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
    
    
        mTextViewHeightConstraint.constant = tv.contentSize.height;
    
        [UIView animateWithDuration:0.2 animations:^{
    
            [self.view layoutIfNeeded];
        }];
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 如果您想在键入过程中一段时间​​后停止 textviewHeight 增加,请实现此并将 textview delegate 设置为 self。

    -(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
    {
        if(range.length + range.location > textView.text.length)
        {
            return NO;
        }
    
        NSUInteger newLength = [textView.text length] + [text length] - range.length;
    
        return (newLength > 100) ? NO : YES;
    
    }
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

只需与您的textView的高度约束建立联系

@IBOutlet var textView: UITextView!
@IBOutlet var textViewHeightConstraint: NSLayoutConstraint!
Run Code Online (Sandbox Code Playgroud)

并在下面使用此代码

textViewHeightConstraint.constant = self.textView.contentSize.height
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您textView被允许与内容一样高,那么

textView.isScrollEnabled = false
Run Code Online (Sandbox Code Playgroud)

应该可以与自动布局一起使用。

如果要保持textView滚动状态,则需要添加可选的高度限制,

internal lazy var textViewHeightConstraint: NSLayoutConstraint = {
  let constraint = self.textView.heightAnchor.constraint(equalToConstant: 0)
  constraint.priority = .defaultHigh
  return constraint
}()

public override func layoutSubviews() {
  super.layoutSubviews()

  // Assuming there is width constraint setup on the textView.
  let targetSize = CGSize(width: textView.frame.width, height: CGFloat(MAXFLOAT))
  textViewHeightConstraint.constant = textView.sizeThatFits(targetSize).height
}
Run Code Online (Sandbox Code Playgroud)

覆盖的原因layoutSubviews()是确保textView正确地水平放置,以便我们可以依靠宽度来计算高度。

由于高度限制设置为较低的优先级,因此如果垂直限制空间textView不足,则的实际高度将小于contentSize。并且textView将是可滚动的。


Rak*_*tri 5

斯威夫特 4+

这对于自动布局来说非常容易!我将解释最简单的用例。假设UITextView您的UITableViewCell.

  • 适合textViewcontentView有约束。
  • 禁用滚动textView
  • 更新tableViewtextViewDidChange

就这样!

protocol TextViewUpdateProtocol {
    func textViewChanged()
}

class TextViewCell: UITableViewCell {
    
    //MARK: Reuse ID
    static let identifier = debugDescription()
    
    //MARK: UI Element(s)
    /// Reference of the parent table view so that it can be updated
    var textViewUpdateDelegate: TextViewUpdateProtocol!
    
    lazy var textView: UITextView = {
        let textView = UITextView()
        textView.isScrollEnabled = false
        textView.delegate = self
        textView.layer.borderColor = UIColor.lightGray.cgColor
        textView.layer.borderWidth = 1
        textView.translatesAutoresizingMaskIntoConstraints = false
        return textView
    }()
    
    //MARK: Padding Variable(s)
    let padding: CGFloat = 50
    
    //MARK: Initializer(s)
    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        addSubviews()
        addConstraints()
        
        textView.becomeFirstResponder()
    }
    
    //MARK: Helper Method(s)
    func addSubviews() {
        contentView.addSubview(textView)
    }
    
    func addConstraints() {
        textView.leadingAnchor  .constraint(equalTo: contentView.leadingAnchor, constant: padding).isActive = true
        textView.trailingAnchor .constraint(equalTo: contentView.trailingAnchor, constant: -padding).isActive = true
        textView.topAnchor      .constraint(equalTo: contentView.topAnchor, constant: padding).isActive = true
        textView.bottomAnchor   .constraint(equalTo: contentView.bottomAnchor, constant: -padding).isActive = true
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}

extension TextViewCell: UITextViewDelegate {
    
    func textViewDidChange(_ textView: UITextView) {
        textViewUpdateDelegate.textViewChanged()
    }
    
}
Run Code Online (Sandbox Code Playgroud)

现在您必须在您的ViewController.

extension ViewController: TextViewUpdateProtocol {
    
    func textViewChanged() {
        tableView.beginUpdates()
        tableView.endUpdates()
    }
    
}
Run Code Online (Sandbox Code Playgroud)

查看我的repo以获得完整的实现。


Ali*_*eri 5

这个答案可能晚了,但我希望它可以帮助某人。

对我来说,这两行代码有效:

textView.isScrollEnabled = false
textView.sizeToFit()
Run Code Online (Sandbox Code Playgroud)

但不要为你的Textview设置高度约束