如何在 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
}
现在最重要的一点。您的文本视图必须满足以下条件:
- 它的高度限制必须设置为 "less than or equal" 以允许它缩小。
- 内容拥抱优先级 必须是您所有观点中的最高价值。这样可以收缩。
- 内容压缩阻力优先级必须低。这保证它不会阻止收缩。
当您单击文本视图的高度限制时,这里是一个正确的选项卡(带有标尺的选项卡)可见:
以及在界面生成器中打开文本视图(又是标尺选项卡)时应该看到的内容:
效果如下图:
所以我在获得我的约束之一时遇到了一些麻烦 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
}
现在最重要的一点。您的文本视图必须满足以下条件:
- 它的高度限制必须设置为 "less than or equal" 以允许它缩小。
- 内容拥抱优先级 必须是您所有观点中的最高价值。这样可以收缩。
- 内容压缩阻力优先级必须低。这保证它不会阻止收缩。
当您单击文本视图的高度限制时,这里是一个正确的选项卡(带有标尺的选项卡)可见:
以及在界面生成器中打开文本视图(又是标尺选项卡)时应该看到的内容:
效果如下图: