2016-08-08 2 views
0

Я добавляю представление программно и изменяя константу ограничения высоты, но он не устанавливает ширину в качестве ширины экрана в методе viewDidLoad. Но ширина прекрасно устанавливается, когда помещается эта строка после 0,2-секундной задержки.Зачем мне нужно установить константу константы после некоторой задержки?

Ниже мой код

Добавлено в ViewDidLoad

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ cAreaView = [[[NSBundle mainBundle] loadNibNamed:@"aView" owner:nil options:nil] objectAtIndex:0]; [_vwComplaintArea addSubview:cAreaView]; [self setConstraintLayout:cAreaView toVw:_vwComplaintArea]; [_firstViewHeightConstraint setConstant:_firstViewHeightConstraint.constant + cAreaView.bounds.size.height]; [_heightForComplaintARe setConstant:cAreaView.bounds.size.height]; });

-(void)setConstraintLayout:(UIView *)vw toVw:(UIView *)toVw { [vw autoSetDimensionsToSize:CGSizeMake(toVw.bounds.size.width, vw.bounds.size.height)]; [vw autoPinEdge:ALEdgeTop toEdge:ALEdgeTop ofView:toVw]; [vw autoPinEdge:ALEdgeLeft toEdge:ALEdgeLeft ofView:toVw]; }

Может кто-нибудь предложить лучший способ установить ограничения в viewDidLoad программно.

Спасибо.

+0

попытаться установить ограничение в viewWillAppear. – Catoshi

+0

Но он показывает некоторую анимацию изменения высоты просмотра. Я не хочу никакой анимации. –

+0

Не могли бы вы предоставить свой код, который не работает и работает? –

ответ

0

Я предлагаю вам переопределить viewWillLayoutSubviews и viewDidLayoutSubviews. В viewDidLoad вам следует добавлять только элементы, которые вы видите из xib, любые манипуляции с фреймом должны возникать в представлении и выполнялись макетные представления. Он должен что-то делать с циклом просмотра.

За документации: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/occ/instm/UIViewController/viewDidLayoutSubviews

Когда изменение оценки за вид на контроллере вида, вид регулирует положение его подвидов, а затем система вызывает этот метод .

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

+0

отрицательный для чего? Не верно? – Miknash

+0

Да. Ему не нужно переопределять 'viewWill/DidLayoutSubviews'. Это было бы необходимо, если бы он использовал фреймы вместо автозапуска. –

+0

Я пытаюсь добавить представление в subview и добавить ограничение. Могу ли я сделать то же самое в методе viewDidLayoutSubviews? @ Cy-4AH –

-1

Не устанавливайте свои ограничения в viewDidLoad. Вместо этого установите их в viewDidAppear или viewDidLayoutSubviews. Так что ваше приложение будет иметь все компоненты, загруженные для применения ограничений.

1

Вы можете изменить константу константы в любое время. Но, как я понял, вы пытаетесь установить постоянное значение view, взятое из view's frame или bounds. Вы должны знать, что в viewDidLoad это свойство не имеет фактических значений, так как вы используете автозапуск; они получат фактические значения в методе viewDidLayoutSubviews (обратите внимание, что его можно вызывать несколько раз). Когда вы добавляете задержку на 0,2 секунды, процессы автозапуска уже завершены, вот почему вы получаете правильный результат. Таким образом, вы можете назначить ограничение константу в viewDidLayoutSubviews, или лучше просто добавить новое ограничение для равной ширины-х:

let someProportion: CGFloat = 2 
view.addConstraint(NSLayoutConstraint(item: yourView, attribute: .Width, relatedBy: .Equal, toItem: view, attribute: .Width, multiplier: someProportion, constant: 0)) 
+0

не будет ли он добавить константу много раз в viewDidLayoutSubviews ?? –

+0

@ManishPatel вы должны позаботиться об этом. вы абсолютно не должны создавать новые ограничения в viewDidLayoutSubviews, вы можете изменять только константы для существующих (созданных в viewDidLoad например) ограничений. Вам нужно предоставить код, который будет гибким и не будет зависеть от предыдущего постоянного значения –

+0

@ManishPatel, но, как я уже сказал, поскольку вы используете автозапуск, лучше переосмыслить логику размеров и сделать новые ограничения равенства без каких-либо манипуляций с рамками/границами. –

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