iOS .addConstraint只能运行一次

时间:2014-08-28 19:39:46

标签: ios xcode swift autolayout ios8

我正在为iOS8和Apple Developer文档制作自定义键盘,它表示您可以在初始主视图在屏幕上绘制后随时更改自定义键盘的高度。它说要做到这一点你应该使用.addConstaint()方法。

这是一个链接: https://developer.apple.com/library/prerelease/ios/documentation/General/Conceptual/ExtensibilityPG/Keyboard.html

我正在使用Swift。键盘的初始高度为215像素。我有一个向上滑动的手势,将高度增加到350像素。哪个按预期工作。向下滑动可将高度更改为300像素。

一切正常,但问题是它只能工作一次。我向上滑动,高度增加,我向下滑动它减少,但如果我再次向上滑动则没有任何反应。如果我再次向下滑动没有任何反应。

所以如果有人能看看我的两个功能并告诉我自己做错了什么,我会很高兴。

以下是代码:

// IBActions
@IBAction func action1(sender: AnyObject) {

    if topboxvisible == false {
        topboxvisible = true
    UIView.animateWithDuration(0.08, delay: 0, options: .CurveEaseIn, animations: {
        self.topbox.frame.offset(dx: 0, dy: 40)

        }, completion: nil)
    }
    let expandedHeight:CGFloat = 300
    let heightConstraint = NSLayoutConstraint(item:self.view,
        attribute: .Height,
        relatedBy: .Equal,
        toItem: nil,
        attribute: .NotAnAttribute,
        multiplier: 0.0,
        constant: expandedHeight)
    self.view.removeConstraint(heightConstraint)
    self.view.addConstraint(heightConstraint)
}

@IBAction func action2(sender: AnyObject) {
    if topboxvisible == true {
        topboxvisible = false
    UIView.animateWithDuration(0.08, delay: 0, options: .CurveEaseOut, animations: {
        self.topbox.frame.offset(dx: 0, dy: -40)
        }, completion: nil)
    }
    let expandedHeight:CGFloat = 350
    let heightConstraint = NSLayoutConstraint(item:self.view,
        attribute: .Height,
        relatedBy: .Equal,
        toItem: nil,
        attribute: .NotAnAttribute,
        multiplier: 0.0,
        constant: expandedHeight)
    self.view.removeConstraint(heightConstraint)
    self.view.addConstraint(heightConstraint)

}

1 个答案:

答案 0 :(得分:1)

您的removeConstraint调用没有做任何事情,因为您刚创建的约束(在上一行代码中)不在视图中。所以你在这里所做的就是每次都能从我看到的东西中添加更多约束。我想这会导致多个冲突的约束 - 你在运行代码时是否看到控制台日志中弹出任何NSConstraint警告?

尝试此操作:提前创建高度约束,并将它们存储在实例变量中。在action1中,删除350高约束,然后添加300.在action2中,删除300,并添加350。