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

Posted

技术标签:

【中文标题】如何在 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 【发布时间】:2017-11-09 14:57:19 【问题描述】:

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

【问题讨论】:

努力并正确标记您的图片 - 提供带有标记元素的故事板屏幕截图和一些代码以获得更好的帮助。 @WladekSurala 刚刚用另一张图片更新了帖子。希望有帮助!! 【参考方案1】:

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

然后将其链接到视图控制器中的 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

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

    它的高度限制必须设置为“小于或等于”才能使其缩小。 内容拥抱优先必须在您的所有视图中具有最高价值。这样可以缩小。 它的抗内容压缩优先级必须很低。这保证了它不会阻止收缩。

当您单击文本视图的高度限制时,可以看到一个适当的选项卡(带有标尺的选项卡):

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

效果如下图:

【讨论】:

非常感谢!我会尝试这种方法并尽快回复您! :) 只有一件事:我以编程方式创建了附件视图,我需要做哪些更改才能使其工作? 是的,您需要以编程方式为其添加约束并将要更改的约束(屏幕底部的约束)作为属性存储在视图控制器中。【参考方案2】:

您可以通过以下方式以编程方式添加约束:

选项 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:

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

【讨论】:

我尝试使用上述方法,但是应用程序刚刚崩溃,提示“无法设置未准备好约束的视图层次结构的布局”。我通常以编程方式设置我的视图和约束。这是我第一次使用故事板,这让我有点困惑。我将此 bottomConstraint 添加到我的 collectionView 中,但它没有用。任何帮助! 我调整了答案以使用情节提要添加约束。

以上是关于如何在 Swift 4 中设置从 collectionView 底部到 Input Accessory View 顶部的约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 的 mpi 中设置从站?

如何在 Swift 4 的 UIView 中创建带圆角的渐变边框

如何在不同的 NSManagedObjectContext 中设置从一个 NSManageObject 到另一个的关系

如何在 Swift 4 CoreData 中设置合并策略

如何在 Alamofire 4 和 Swift 3 中设置方法、标题、参数

如何在 swift 4 中的 UserDefalts 中设置自定义类数组数据