2014-01-09 5 views
26

Скажите, что у меня есть проект, который выглядит следующим образом:UIView анимированные изменения с авто ограничений макета

enter image description here

Есть два UIView s - один называется yellowBox, а другой называется redBox. Ограничения автоматического макета диктуют, что yellowBox - это 60 точек от вершины супервизора с 350 точками переднего и конечного пробелов (то есть слева и справа от представления). redBox имеет те же ограничения на ведущее и конечное пространство. Существует ограничение вертикального пространства между двумя ячейками 0, чтобы указать, что нижняя часть yellowBox всегда должна быть непосредственно сверху redBox.

Когда пользователь нажимает Развернуть кнопку Yellow Box, я хотел бы высоту yellowBox расти и, как следствие, к redBox двигается вниз, чтобы продолжить, удовлетворяющие вертикальное пространство ограничения (что yellowBox всегда на вершине redBox). Вот код анимации:

- (IBAction)expandYellowBox:(id)sender { 

    [UIView animateWithDuration:0.5 
        animations:^{ 
         CGRect newFrame = self.yellowBox.frame; 
         newFrame.size.height += 50; 
         self.yellowBox.frame = newFrame; 
        }]; 

} 

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

enter image description here

, который является достаточно справедливым, поскольку нет никакого способа для автоматического макета знать высоту коробки. Однако я не знаю, как решить эту проблему таким образом, чтобы она позволяла изменять размеры и перемещать ящики. Например, если я укажу ограничение высоты на yellowBox, это предотвратит его изменение размера. Если установить ограничение по высоте, чтобы быть больше или равно (разрешить yellowBox высоту, чтобы увеличить), то я получаю другую ошибку ограничение:

enter image description here

Все ограничения, были установлены с помощью Xcode в раскадровке - ни один из них не был написан в коде.

Любая помощь очень ценится.


EDIT: Как выясняется, yellowBox растет, когда кнопка нажата - это просто я не могу сказать, потому что кажется, за redBox. Я заметил только после четырехкратного щелчка, и он начал появляться в нижней части redBox. Тем не менее, остается тот же вопрос - как заставить redBox всегда придерживаться нижней части yellowBox.

+0

может у проверить погоду метод viewDidLayoutSubViews называется в Уре ViewController? При выполнении события click. – CoolMonster

+0

Нет, метод 'viewDidLayoutSubViews' не вызывается. – Skoota

+0

попытка установить привязку вместо кадра может работать некоторое время. даже повторить self.yellowBox.frame = newFrame; дважды в u код может также исправлять несколько раз – CoolMonster

ответ

80

Попробуй как уже упоминалось shwet-solanki, но добавьте следующую строку после изменения ограничения:

[self.view layoutIfNeeded]; 

IBAction будет выглядеть так:

- (IBAction)expandYellowBox:(id)sender { 

[UIView animateWithDuration:0.5 
       animations:^{ 
        self.yellowBoxHeightConstraint.constant += 50; 
        [self.view layoutIfNeeded]; 
       }]; 
} 

Где yellowBoxHeightConstraint является IBOutlet по высоте скованности yellowBox. Надеюсь, это поможет.

+0

Спасибо за предложение, но это точный подход, который я пытаюсь избежать. Я не хочу вручную настраивать рамку 'redBox', поскольку это должно двигаться в силу ограничений. В этом случае тривиально, но пример в этом вопросе - это всего лишь тестовый проект, демонстрирующий проблему. Фактическая проблема возникает в гораздо более крупном проекте, где использование подхода, который вы предложили, к сожалению, не может быть осуществимым или поддерживаемым. – Skoota

+0

Надеюсь, вы заметили, что я отредактировал свой ответ. Текущий метод должен работать. Попробуйте это. – GoGreen

+0

Спасибо, что хорошо работает. – Skoota

3
  1. Добавить ограничение высоты для обоего взглядов
  2. Создания IBOutlet для ограничения высоты yellowbox
  3. Теперь вместо того, чтобы изменить высоту yellowbox в кнопках нажимаются события в, а изменить значение высоты ограничения. то есть предположит, что ваше IBOutlet имя ограничения yellowBoxHeightConstraint, то yellowBoxHeightConstraint.constant += 50;

Надеется, что это работает для вас.

+2

Спасибо, что расширяет 'yellowBox' (с« redBox », прикрепленным к нижней части' yellowBox'), но он не оживляет изменения - это происходит внезапно. – Skoota

1
// 
// WPViewController.h 
// AutoLayoutTEst 
// 
// Created by VASANTH K on 09/01/14. 
// 
// 

#import <UIKit/UIKit.h> 

@interface WPViewController : UIViewController 
@property (strong, nonatomic) IBOutlet UIButton *button1; 
- (IBAction)buttClicked:(id)sender; 
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *heightConstrain; 

@property (strong, nonatomic) IBOutlet UIButton *button2; 
@end 

нажмите Event

- (IBAction)buttClicked:(id)sender { 


    self.heightConstrain.constant=100; 


} 

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

https://github.com/vasanth3008/AutoLayoutHeighDemo

см мой пример демонстрационный проект

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