2016-07-14 2 views
1

У меня есть UIView и внутри этого UIView у меня есть еще один UIView, позволяет сказать, что родитель и ребенок UIView. Я установил высоту и ширину родительского UIView до 400 в storyboard и установил дочерний вид constraint, чтобы получить 8px margin сверху, слева направо и снизу из своего супервизора.макет не меняется, когда родитель (UIView) размер изменяется

Но когда я изменяю размер родительского вида на 200, размер детского вида остается таким же. Я попытался это как в viewdidload и viewdidappear

CGRect frm = self.mainTimerView.frame; 
frm.size.width = size; 
frm.size.height = size; 
self.mainTimerView.frame = frm; 

, когда я изменить родительский вид на 200 ребенка должен установить его самостоятельно на 200-16 высоту и ширину в соответствии с ограничениями.

+0

Вы берете размер от «mainTimerView», а затем снова устанавливаете «mainTimerView» того же размера. Как это может измениться. – WasimSafdar

+0

call [parent layoutIfNeeded] – akc

+0

Wasim Я изменяю его ширину и высоту во 2-й и 3-й строках, а затем снова назначаю его mainTimerView – Yawar

ответ

1

Не следует смешивать с использованием uiconstraint с помощью frame.If вы хотите изменить размер при использовании uiconstraint, вы должны сделать выход из ограничения, а затем изменить постоянное property.Call ограничения в layoutIfNeeded, то вы можете получить правильную рамку.

@interface ViewController() 

@property (weak, nonatomic) IBOutlet UIButton *mainTimerView; 
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *mainTimerViewHeightConstraint; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.view layoutIfNeeded]; 
    NSLog(@"%@",@(self.mainTimerView.frame.size.width)); 

    self.mainTimerViewHeightConstraint.constant = 100; 

    [self.view layoutIfNeeded]; 
    NSLog(@"%@",@(self.mainTimerView.frame.size.height)); 
} 

@end 

Вызов layoutIfNeeded цели заставить макет подобозрения перед нанесением, то viewDidLayoutSubviews будет называться. Обратите внимание, что вы можете получить правильный фрейм в viewDidLayoutSubviews. Другими словами, вы можете получить нужный кадр после того, как был вызван viewDidLayoutSubviews.

- (void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    NSLog(@"%@",NSStringFromCGRect(self.mainTimerView.frame)); 
} 
0

Вы пробовали позвонить setNeedsLayout на родительский режим? Этот вызов используется для того, чтобы спросить представление о макете своих подзонов. Из раздела обсуждения setNeedsLayout's:

Вызовите этот метод в основном потоке приложения, если вы хотите отрегулировать расположение подзонов представления. Этот метод незамедлительно отмечает запрос и возвращает его. Поскольку этот метод не вызывает немедленного обновления, но вместо этого ожидает следующий цикл обновления, вы можете использовать его для отмены макета нескольких представлений до того, как какое-либо из этих представлений будет обновлено. Такое поведение позволяет консолидировать все ваши обновления макета в один цикл обновления, что обычно лучше для производительности.

Вызов layoutIfNeeded может быть другой вариант. Но, согласно документам, он заставляет немедленную компоновку и, следовательно, не обеспечивает преимущества консолидации, полученные с помощью setNeedsLayout.

layoutIfNeeded справки о:

выкладывает подвидов немедленно.

2

1) Изменение height ограничения в mainview.

2) Вызвать метод layoutIfNeeded.

3) Сделайте это на viewDidAppear.

0

enter image description here

Plz создать IBOutlet на ограничение высоты родительского вида.

IBOutlet NSLayoutConstraint *RedViewHeightconstraint; 

- (void)viewWillAppear:(BOOL)animated 
{ 
    RedViewHeightconstraint.constant = 500; 
} 

он будет работать для вас

0

Вам просто нужно создать IBOutlets ограничений по высоте и ширине mainTimerView. После того, как вы сделаете это добавить следующие строки кода:

constraintOuterViewHt.constant = 200 constraintOuterViewWidth.constant = 200

Вам не нужно делать что-нибудь еще. Check screen shot here

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