2015-03-24 3 views
0

Я пытаюсь добавить ограничение программно в выбранный UITextField внутри UITableViewCell. Он добавлен успешно, и выбранная ширина поля текста увеличивается. Но когда я пытаюсь удалить добавленное ограничение, это не сработает. Может ли кто-нибудь выяснить, где я совершаю ошибку?NSLayoutConstraint не удаляется

-(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]; 
    } 

} 

ответ

0

Ну, очевидно, это не работает.

Если я предполагаю, что правильный, setViewMovedUp - сеттер, выполняемый при изменении свойства viewMovedUp.

Когда метод выполняется, вы создаете новое ограничение с:

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

Основываясь на значении movedUp вы либо добавить его или попытаться удалить его. Поэтому, если вы установили viewMovedUp в YES 5 раз подряд, у вас будет 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 инстанции , и повторно использовать его.

0

Мое предложение было бы добавить ограничение только один раз (возможно, в методе установки или событии storyboard и иметь IBOutlet), а затем активировать/деактивировать его в соответствии с вашей логикой.

-(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 после изменения ограничений. Этот метод заставляет представление передать свои подзоны с новыми ограничениями.

Надеюсь, что это сработает! Дайте мне знать, как это происходит :)

Смежные вопросы