更新通过Swift 3

时间:2017-03-22 02:52:55

标签: swift uitextview nslayoutconstraint

我的UIViewController中有一个与设置UITextView高度的约束相关的变量:
var textViewHeight: Int!

这是约束:
self.view.addConstraintsWithFormat(format: "V:|-74-[v0(\(textViewHeight!))]", views: self.textView)

我使用这个扩展名:

extension UIView
{
    func addConstraintsWithFormat(format: String, views: UIView...)
    {
        var viewDict = [String: AnyObject]()
        for (index, view) in views.enumerated()
        {
            view.translatesAutoresizingMaskIntoConstraints = false
            let key = "v\(index)"
            viewDict[key] = view
        }
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: NSLayoutFormatOptions(), metrics: nil, views: viewDict))
    }
}

我已经设置了一个在键盘出现时触发的通知。 它被正确触发(我有print并且它总是正确触发)并且执行的函数包括以下代码:

if let keyboardSize = sender.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? CGRect {
        print(keyboardSize.height)
        self.textViewHeight = Int(self.view.frame.height-keyboardSize.height-100)
        self.view.updateConstraints()
}

键盘的高度打印正确但文本视图的高度未更改.....
提前谢谢!

1 个答案:

答案 0 :(得分:1)

如果变量值(在本例中为textViewHeight)稍后更改,则只需使用可视格式设置约束一次就不会更新约束。因此,您必须通过代码实际设置约束,以后可以在textViewHeight值更改时进行修改。

以下是您需要的更改:

1:添加一个变量来保存对您以后想要修改的约束的引用。

var heightConstraint:NSLayoutConstraint!

2:单独为文本视图创建约束,而不是使用可视格式(self.view.addConstraintsWithFormat(format: "V:|-74-[v0(\(textViewHeight!))]", views: self.textView)

// Add vertical constraints individually
let top = NSLayoutConstraint(item:textView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem:topLayoutGuide, attribute: NSLayoutAttribute.bottom, multiplier:1.0, constant:74.0)
heightConstraint = NSLayoutConstraint(item:textView, attribute:NSLayoutAttribute.height, relatedBy: NSLayoutRelation.equal, toItem:nil, attribute:NSLayoutAttribute.notAnAttribute, multiplier:1.0, constant:textViewHeight)
view.addConstraint(top)
view.addConstraint(heightConstraint)

3:您最好将textViewHeight更改为CGFloat,因为您处理的所有值都将是CGFloat值,而不是Int

4:在您获得键盘通知后,在计算textViewHeight后,添加以下行:

self.heightConstraint.constant = textViewHeight

从那时起,这应该可以解决问题,当textViewHeight发生变化时,约束也会更新:)