如何在 Swift 4 中设置从 collectionView 底部到 Input Accessory View 顶部的约束

How to set constraints from the bottom of a collectionView to the top of Input Accessory View in Swift 4

所以我在获得我的约束之一时遇到了一些麻烦 right.Basically 我正在使用故事板在屏幕上放置两个视图。一个是 UITextView,另一个是 collectionView。 CollectionView 在 UItextView 下面。我希望我的 collectionView 的底部约束连接到每次出现键盘时弹出的输入附件视图的顶部。 通过这样做,我基本上使 textview 高度动态化。有什么办法可以做到这一点? Here is a picture 这两个圆圈是输入附件视图的一部分。我希望将作为优先级的 collectionview 连接到输入附件视图的顶部。 这是另一张带有详细标签和标记的图片: Detailed markup 请帮忙!

您可以像这样以编程方式添加约束:

选项 1:

let bottomContraint = NSLayoutConstraint(item: self.collectionView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.textField, attribute: NSLayoutAttribute.top, multiplier: 1.0, constant: 8.0)

self.view.addConstraint(bottomContraint)

选项 2:

使用故事板,按住 Control 键并从文本字段拖动到集合视图,然后单击垂直间距。然后您可以点击编辑约束并检查第一项是 textField.Top,第二项是 collectionView.Bottom。然后您可以更改常量,包括需要使用负数。

首先,创建一个从您的配件到屏幕底部的约束。

然后 link 它到你的视图控制器中的 IBOutlet:

您必须对键盘显示和隐藏事件做出反应。所以你注册了来自 UIKit 的通知。发生此事件时,您会动态更改身高。

将此添加到视图控制器的实现中:

@IBOutlet weak var constraintToChange: NSLayoutConstraint!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(_:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(_:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil)

}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    NotificationCenter.default.removeObserver(self)
}
//other methods skipped

@objc func keyboardWillShow(_ notification: Notification) {
    guard let userInfo = notification.userInfo else {
        return //no info to get keyboard size from
    }
    guard let keyboardSize =  (userInfo[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue else {
        return //no keyboard size to determine height
    }

    constraintToChange.constant = keyboardSize.height //+ your desired height above keyboard
}

@objc func keyboardWillHide(_ notification: Notification){
    constraintToChange.constant = 0.0 //+ your desired height above bottom of the screen
}

现在最重要的一点。您的文本视图必须满足以下条件:

  1. 它的高度限制必须设置为 "less than or equal" 以允许它缩小。
  2. 内容拥抱优先级 必须是您所有观点中的最高价值。这样可以收缩。
  3. 内容压缩阻力优先级必须低。这保证它不会阻止收缩。

当您单击文本视图的高度限制时,这里是一个正确的选项卡(带有标尺的选项卡)可见:

以及在界面生成器中打开文本视图(又是标尺选项卡)时应该看到的内容:

效果如下图: