2013-09-19 3 views
11

У меня есть веб-страницы, которые начинаются с шириной Constrain 100.Как изменить ограничение в коде

Когда пользователь нажимает кнопку, я хочу, чтобы изменить Ограничить к: 200.

Я попытался это :

NSLayoutConstraint *constrain = [NSLayoutConstraint 
           constraintWithItem:self.webPage 
           attribute:NSLayoutAttributeWidth 
           relatedBy:NSLayoutRelationEqual 
           toItem:self.webPage 
           attribute:NSLayoutAttributeWidth 
           multiplier:1 
           constant:100]; 




[self.webPage addConstraint:constrain]; 

Но это выкидывает это исключение: «Невозможно одновременно удовлетворяют ограничениям.»

Любые идеи?

ответ

26

У вас есть два варианта.

  1. Получить ссылку на оригинальное ограничение и изменения constant части до 200
  2. Получить ссылку на оригинальное ограничение и удалить его с точки зрения, и добавить новое ограничение

Я бы перейти к первому варианту. Чтобы получить ссылку, добавьте @property для ограничения вашего viewController и назначьте его при его создании.

Если вы создаете ограничение в xib или раскадровке, соедините ограничение с подключением IBOutlet к вашему коду, аналогично тому, что вы делаете при подключении UILabel.

Затем вы можете легко отрегулировать постоянную часть ограничения.


Также ограничение, вероятно, следует больше вдоль этих линий:

NSLayoutConstraint *constrain = [NSLayoutConstraint 
           constraintWithItem:self.webPage 
           attribute:NSLayoutAttributeWidth 
           relatedBy:NSLayoutRelationEqual 
           toItem:nil 
           attribute:NSLayoutAttributeNotAnAttribute 
           multiplier:1 
           constant:100]; 
+1

Отлично, вы можете показать, как получить доступ к исходному ограничению (что и было сделано в IB)? – oopsi

+4

Соедините ограничение с IBOutlet. Подобно тому, как вы это делаете, когда подключаете UILabel или что-то в этом роде. –

+0

Любая идея о том, как я могу изменить ограничение с анимацией? – oopsi

9

, если вы хотите, чтобы установить ширину не имеют toItem: набор.

_myConstrain = [NSLayoutConstraint 
          constraintWithItem:self.webPage 
          attribute:NSLayoutAttributeWidth 
          relatedBy:NSLayoutRelationEqual 
          toItem:nil 
          attribute:NSLayoutAttributeNotAnAttribute 
          multiplier:1 
          constant:100]; 

// add to superview! not to self.webPage 
[self.view addConstraint:_myConstrain]; 

Если вы хотите изменить его позже:

_myConstrain.constant = 200.0f; 
[self.view layoutIfNeeded]; // you may be able to call this on self.webPage 
+0

Блестящий подход. –

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