如何为高度变化添加观察者?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何为高度变化添加观察者?相关的知识,希望对你有一定的参考价值。

我有一个文本区域,应该具有灵活的高度,沿着你编写的行数增长。

我想听听它的高度变化,然后当创建一个新线时,这个听众会说“嗨高度已经改变了!”。

Initial Height

----------初始高度----------

Height has changed !

----------身高已经改变了! ----------

我无法找到一个正确的方法来做到这一点,因为swift中的addObserver需要像keyboardWillShow这样的NotificationIdentifier,在这里我没有像heightWillChange那样的。

高度改变后如何调用函数?

答案

使用你的UITextView的委托方法

var textViewHeight: CGFloat = 0

func textViewDidChange(textView: UITextView)
{
    let newTextViewHeight = textView.frame.size.height
    if textViewHeight != newTextViewHeight
    {
        print("---------- Height has changed !!! ----------")
    }
    textViewHeight = newTextViewHeight
}
另一答案

你可以使用KVO。如果您是从视图控制器执行此操作,则可以在viewDidLoad中添加观察。例如:

    override func viewDidLoad() {
        super.viewDidLoad()
        self.textField = UITextField(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))

        self.textField.addObserver(self, forKeyPath: "frame", options: .New, context: nil)
    }

然后回复:

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if keyPath == "frame" && object === self.textField
        {
            print(self.textField.frame)
        }
    }

然后在取消视图控制器时删除观察:

deinit {
    self.textField.removeObserver(self, forKeyPath: "frame")
}
另一答案
extension MyThing: UITextViewDelegate {
    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        guard let oldText = textView.text else {
            return true
        }
        let newText = (textView.text as NSString).replacingCharacters(in: range, with: text)

        let size = CGSize(width: textView.bounds.width, height: CGFloat.greatestFiniteMagnitude)
        let font = textView.font!

        let oldTextRect = newText.boundingRect(with: size,
                                               options: .usesLineFragmentOrigin,
                                               attributes: [.font : font],
                                               context: nil)
        let newTextRect = oldText.boundingRect(with: size,
                                               options: .usesLineFragmentOrigin,
                                               attributes: [.font : font],
                                               context: nil)
        if oldTextRect != newTextRect {
            print("Text height changed")
        } else {
            print("Text height didnt change :(")
        }
        return true
    }
}

以上是关于如何为高度变化添加观察者?的主要内容,如果未能解决你的问题,请参考以下文章

如何为片段设置观察者

如何为 Grid RowDefinition 高度变化设置动画(当 Height="Auto" 时)

如何为运行时计算的变量高度设置布局约束?

如何为动态创建的控件实现自动布局?

如何为 youtube 添加 wmode="opaque" 或 wmode="transparent" 到这个 php 片段? [复制]

如何为具有动态高度的表格单元格添加底部阴影?