Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用键盘动画调整约束大小_Ios_Swift_Interface Builder - Fatal编程技术网

Ios 使用键盘动画调整约束大小

Ios 使用键盘动画调整约束大小,ios,swift,interface-builder,Ios,Swift,Interface Builder,我正在尝试设置我的UIStackView的动画,每当键盘出现时,它都包含一个登录表单。我只想通过调整故事板文件中的约束来实现这一点 这是我的布局: 我的代码根据键盘的大小调整底部约束的大小 @IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint! override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.a

我正在尝试设置我的
UIStackView
的动画,每当键盘出现时,它都包含一个登录表单。我只想通过调整故事板文件中的约束来实现这一点

这是我的布局:

我的代码根据键盘的大小调整底部约束的大小

@IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint!

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardNotification(notification:)), name: NSNotification.Name.UIKeyboardWillChangeFrame, object: nil)

    keyboardHeightLayoutConstraint.isActive = false
}

func keyboardNotification(notification: NSNotification) {
    keyboardHeightLayoutConstraint.isActive = true
    if let userInfo = notification.userInfo {
        let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
        let duration:TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
        let animationCurveRawNSN = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber
        let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIViewAnimationOptions.curveEaseInOut.rawValue
        let animationCurve:UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw)

        if (endFrame?.origin.y)! >= UIScreen.main.bounds.size.height {
            self.keyboardHeightLayoutConstraint?.constant = 0.0
        } else {
            self.keyboardHeightLayoutConstraint?.constant = (endFrame?.size.height)! + 20
        }
        UIView.animate(withDuration: duration,
                       delay: TimeInterval(0),
                       options: animationCurve,
                       animations: { self.view.layoutIfNeeded() },
                       completion: nil)
    }
}
结果是,它只会缩小UIStackView的大小,因为顶部约束不允许它向上移动,例如:


这与我的stackview的顶部约束有关。删除此约束可以解决此问题,但在较小的分辨率下,表单可能与
UIImageView
重叠。是否有方法更新此约束以反映底部约束的更改?

将该约束的优先级(从图像视图到堆栈视图)降低到200。200的优先级低于默认的内容压缩优先级,因此autolayout将在压扁其他视图之前将其打破。

您可以设置顶部和底部约束的出口,并同时更改它们。我已经做过很多次了


我不完全清楚您的约束布局,但我猜您希望添加到底部布局的约束中,并从顶部布局的约束中减去

我尝试过,但结果是]()缺少顶部约束,因此可以在较小的分辨率上重叠这正是我想要的。这是否意味着我需要底部出口约束和顶部出口约束?如果底部得到+20,顶部应该得到-20?这将在没有约束冲突的情况下工作?然后,当您隐藏键盘时,您将反转更改(从底部减去20,在顶部加20)我执行了以下操作:在代码中创建3个约束输出:1 UIStackView和底部布局指南之间的底部约束1 UIStackView和UIImageView之间的顶部约束1 UIImageView和顶部布局指南之间的顶部约束:1:计算到底部布局约束添加了多少。2:将加法除以/2 3:将两个顶部约束减半。但是,我的stackview被拉伸,我收到“无法同时满足约束”消息。如果这没有任何意义,这里是键盘事件前后的图片::()](),您只需要2个就可以更改2个约束。如果希望堆栈视图和图像视图移动,请保留它们之间的约束,并调整最底部和最顶部的约束。