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个约束。如果希望堆栈视图和图像视图移动,请保留它们之间的约束,并调整最底部和最顶部的约束。