设置后NSLayoutConstraint常量不更新

时间:2014-08-11 10:32:15

标签: ios objective-c uiviewanimation nslayoutconstraint

我有一个UIView子类,带有相应的xib文件。在我的xib中,我有一个NSLayoutConstraint属性,我正在试图制作动画。我有一个animateIn方法。问题是只有animateIn方法有效。当我尝试再次更新常量时,它只是保持在先前的值。

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *horizontalConstraint;

按下按钮后,我正在尝试更新常量。但是在设置之后,常量似乎没有更新。即使将其设置为-500,它仍然会记录0。我正在呼叫layoutIfNeeded,但没有任何反应。

// this works
- (void) animateIn { 
    [UIView animateWithDuration:1.0 delay:2.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.alpha = 1.0;
    } completion:^(BOOL finished) {

        [UIView animateWithDuration:1.0 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
            self.horizontalConstraint.constant = 0;
            [self layoutIfNeeded];
        } completion:^(BOOL finished) {
        }];
    }];
}

// this does not work
- (IBAction)resume:(id)sender {
        self.horizontalConstraint.constant = -500;
        [self layoutIfNeeded];

        NSLog(@"%f",self.horizontalConstraint.constant); // this always stays 0
    }

更新

当我想再次使用它时,我的NSLayoutConstraint似乎是(null)。这可以解释为什么它没有更新。我该如何引用它?

5 个答案:

答案 0 :(得分:45)

您需要调用存在NSLayoutConstraint的相应setNeedsUpdateConstraints的{​​{1}}方法来更新约束。

例如UIButton

UIView(control)

在你的情况下

self.buttonConstraint.constant = 55;
[self.btnTest setNeedsUpdateConstraints];

答案 1 :(得分:9)

你确定这个约束在某个地方没有被激活吗? 将约束的“active”属性设置为false会导致视图层次结构删除约束。如果您还没有对它的引用,则约束对象将从内存中删除。

我和你有同样的问题,并删除了“弱”,因此约束现在是一个强大的属性。因此,在取消激活时它不会设置为nil(因为我的视图控制器总是有一个强大的指针),我可以重新激活它并重新设置它的常量。

import codecs
with codecs.open("G:/InsideReCaptcha-master/enc", mode='rb') as fd:
    ttt = fd.read(4)
    seed = unpack('>I', ttt)[0]

答案 2 :(得分:5)

完成约束更改后,只需调用:

[self setNeedsUpdateConstraints];

答案 3 :(得分:5)

我遇到了一个问题,我第一次在代码中设置约束常量将设置常量,但之后调用layoutIfNeeded(),例如:

myConstraint.constant = newValue;
[view layoutIfNeeded]

常数会回到原始值!我可以在调试器中看到值的变化。

我终于弄清楚这是因为,在故事板中,我设定了常数的变化。例如:

enter image description here

一旦我删除了变体,约束常量值就没有通过layoutIfNeeded调用回到原始值。

答案 4 :(得分:-1)

horizo​​ntalConstraint属性应该由视图本身保存。只要视图处于活动状态,属性就不应该为nil(除非您在代码中的其他位置将其设置为nil)。仔细检查是否错误地将其设置为nil。