5

У меня есть контроллер представления, выложенный в раскадровке с включенным автозапуском, и я ищу способ изменить ограничения, чтобы позволить моему представлению поворачиваться в альбомные и переставлять кнопки на экране. Когда я пытаюсь выполнить код ниже, я получаю около двух десятков сообщений «неспособных удовлетворить ограничениям, прерываниям ...», которые я не могу действительно декодировать.UIStoryboard как заменить ограничения программно?

Есть ли способ динамически заменить ограничения из раскадровки ограничениями, которые я указываю программно? Я хочу полностью переопределить макет кнопок, которые я определил в раскадровке.

-(void)updateViewConstraints 
{ 
    [super updateViewConstraints]; 

    self.loginButton.translatesAutoresizingMaskIntoConstraints = NO; 
    self.getStartedButton.translatesAutoresizingMaskIntoConstraints = NO; 
    self.takeTourButton.translatesAutoresizingMaskIntoConstraints = NO; 



    [self.loginButton removeConstraints:self.loginButton.constraints]; 
    [self.getStartedButton removeConstraints:self.getStartedButton.constraints]; 
    [self.takeTourButton removeConstraints:self.takeTourButton.constraints]; 


    one = self.loginButton; 
    two = self.getStartedButton; 
    three = self.takeTourButton; 


    NSDictionary *metrics = @{@"height":@50.0,@"width":@100.0,@"leftSpacing":@110.0}; 
    NSDictionary *views = NSDictionaryOfVariableBindings(one,two,three); 

    [self.view removeConstraints:activeTestLabelConstraints]; 
    [activeTestLabelConstraints removeAllObjects]; 

    if(isRotatingToLandscape) 
    { 

     [self registerConstraintsWithVisualFormat:@"|-[one(two)]-[two(three)]-[three]-|" options:NSLayoutFormatAlignAllTop | NSLayoutFormatAlignAllBottom metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"V:[one(height)]-|" options:0 metrics:metrics views:views]; 

    }else 
    { 

     [self registerConstraintsWithVisualFormat:@"|-leftSpacing-[one(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"[two(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"[three(width)]" options:0 metrics:metrics views:views]; 
     [self registerConstraintsWithVisualFormat:@"V:[one(height)]-[two(75)]-[three(100)]-|" options:NSLayoutFormatAlignAllCenterX metrics:metrics views:views]; 
    } 


} 

Обновленный с ответом Роба, вот метод, чтобы устранить ограничения, которые я использую

-(void)removeConstraintForView:(UIView*)viewToModify 
{ 

    UIView* temp = viewToModify; 
    [temp removeFromSuperview]; 
    [self.view addSubview:temp]; 

} 

ответ

10

Это звучит, как вы хотите, чтобы просто удалить все ограничения на вид. Поскольку ограничения на представление часто удерживаются предком представления, неясно, как легко удалить все ограничения. Но на самом деле это довольно легко.

Удаление представления из иерархии представлений устраняет любые ограничения между представлением и другими видами вне его. Так что просто удалить вид из его надтаблицы, а затем добавить его обратно:

// Remove constraints betwixt someView and non-descendants of someView. 
UIView *superview = someView.superview; 
[someView removeFromSuperview]; 
[superview addSubview:someView]; 

Если есть какой-либо ограничение Betwixt и его потомки, эти ограничения могут быть проведены самим (но не может быть проведено любыми потомками ). Если вы также хотите удалить эти ограничения, вы можете сделать это напрямую:

// Remove any remaining constraints betwixt someView and its descendants. 
[someView removeConstraints:[someView constraints]]; 
+0

Спасибо, это сработало! –

+0

Я заметил, что удаление subview из супервизора, похоже, не работает для ограничений, определенных для этого поднабора (например, приподнятой высоты и ширины). –

+0

Вторая часть моего ответа удалит ограничения ширины и высоты. –

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