NSLayoutConstraint未被删除

时间:2015-03-24 13:55:14

标签: ios autolayout nslayoutconstraint

我正在尝试以编程方式向UITableViewCell中的所选UITextField添加约束。它已成功添加,并且选定的文本字段宽度正在增加。 但是当我尝试删除添加的约束时,它就不起作用了。可以任何人弄清楚我在做错误的地方吗?

-(void)setViewMovedUp:(BOOL)movedUp
{
    if (self.currentTextField.tag!=HEADER_FIELD_TAG) {
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:0.3]; // if you want to slide up the view
        [self.view bringSubviewToFront:self.currentTextField];
        NSLayoutConstraint *constraintTrail = [NSLayoutConstraint constraintWithItem:self.currentTextField.superview
                                     attribute:NSLayoutAttributeTrailing
                                     relatedBy:NSLayoutRelationEqual
                                        toItem:self.currentTextField
                                     attribute:NSLayoutAttributeTrailing
                                    multiplier:1.0
                                      constant:0.0];

        CGRect rect = self.view.frame;
        CGRect tableRect = self.currentTextField.frame;
        if (movedUp)
        {
            // 1. move the view's origin up so that the text field that will be hidden come above the keyboard
            // 2. increase the size of the view so that the area behind the keyboard is covered up.
            [self.currentTextField.superview addConstraint:constraintTrail];
            rect.origin.y -= kOFFSET_FOR_KEYBOARD;
            rect.size.height += kOFFSET_FOR_KEYBOARD;
            tableRect.size.width += 800;

        }
        else
        {
            // revert back to the normal state.
            [self.currentTextField.superview removeConstraints:@[constraintTrail]];
            rect.origin.y += kOFFSET_FOR_KEYBOARD;
            rect.size.height -= kOFFSET_FOR_KEYBOARD;
            tableRect.size.width -= 800;
        }
        infoFieldTable.frame = tableRect;
        self.view.frame = rect;

        [UIView commitAnimations];
    }

}

2 个答案:

答案 0 :(得分:0)

嗯,它显然不起作用。

如果我想对了,setViewMovedUp是一个setter,在viewMovedUp属性发生变化时执行。

执行方法时,使用以下命令创建新约束:

    NSLayoutConstraint *constraintTrail = [NSLayoutConstraint constraintWithItem:self.currentTextField.superview
                                 attribute:NSLayoutAttributeTrailing
                                 relatedBy:NSLayoutRelationEqual
                                    toItem:self.currentTextField
                                 attribute:NSLayoutAttributeTrailing
                                multiplier:1.0
                                  constant:0.0];

根据movedUp的值,您可以添加它或尝试删除它。因此,如果您连续5次将viewMovedUp设置为YES,则您将拥有5个约束。当您将其设置为NO时,您尝试删除新创建的约束,而不是先前添加的约束。


您最想要的是为该约束创建属性:

@property (nonatonic, strong) NSLayoutContraint *constraintTrail;

并将您的代码更改为:

    if (!self.contraintTrail) {
        self.contraintTail = [NSLayoutConstraint constraintWithItem:self.currentTextField.superview
                                                          attribute:NSLayoutAttributeTrailing
                                                          relatedBy:NSLayoutRelationEqual
                                                             toItem:self.currentTextField
                                                          attribute:NSLayoutAttributeTrailing
                                                         multiplier:1.0
                                                           constant:0.0];
    }

这样,您只需在NSLayoutContraint实例上创建,然后重复使用它。

答案 1 :(得分:0)

我的建议是只添加一次约束(可能在设置方法或事件中storyboard并且有一个IBOutlet),然后根据您的逻辑激活/停用它。 / p>

-(void)setViewMovedUp:(BOOL)movedUp
{
    if (self.currentTextField.tag!=HEADER_FIELD_TAG) {

        // All your logic here ...

        // Set the active property on the constraint
        [self.constraintTrail setActive:movedUp];
    }
}

另一点是,在更改约束后,您不会调用layoutIfNeeded。此方法使视图使用新约束重新布局其子视图。

希望它有效!让我知道它是怎么回事:)