У меня проблемы с NSLayoutConstraint
.
NSLayoutConstraint дает мне исключение, если я пытаюсь изменить constant
с помощью метода setConstant:
. У меня возникает эта проблема только тогда, когда я добавляю ограничение по высоте с помощью кода.
Во-первых, я получаю ограничение по высоте следующим образом:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstAttribute = %d", NSLayoutAttributeWidth];
NSArray *filteredArray = [[self constraints] filteredArrayUsingPredicate:predicate];
return filteredArray[0];
Что дает мне правильное ограничение. У меня есть подкласс NSTextField, где это работает отлично. Ограничения устанавливаются в построителе интерфейсов, и я могу устанавливать и изменять константу.
Теперь у меня есть представление, куда я добавляю различные подпредставления во время выполнения. Эти подпредставления расположены в собственных NIB, что означает, что я не могу зафиксировать их ширину и высоту. Поэтому я подумал, что добавлю ограничения, как только представление будет добавлено в суперпредставление. Это выполняется в viewDidMoveToSuperview
.
// Pin Width & Height
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.width]];
[self addConstraint:[NSLayoutConstraint constraintWithItem:self
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0f
constant:self.frame.size.height]];
Ограничения добавлены, я могу подтвердить это с помощью NSLog.
"<NSLayoutConstraint:0x100605cc0 H:[ITControlPanelChildView:0x100616eb0(269)]>",
"<NSLayoutConstraint:0x100614410 V:[ITControlPanelChildView:0x100616eb0(317)]>"
Теперь, наконец, когда я пытаюсь изменить ограничение с помощью [constraint setConstant:somethingDifferent];
, я получаю следующее исключение:
Unable to simultaneously satisfy constraints:
(
"<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>",
"<NSAutoresizingMaskLayoutConstraint:0x10053ff10 h=--& v=&-- V:[ITControlPanelChildView:0x10192e4f0(317)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x10192fcb0 V:[ITControlPanelChildView:0x10192e4f0(100)]>
Это именно то ограничение, которое я пытаюсь изменить. Может ли кто-нибудь объяснить мне, почему это происходит?
РЕДАКТИРОВАТЬ
Я только что прочитал, что NSAutoresizingMaskLayoutConstraint
добавляются автоматически, что можно отключить, если установить [self setTranslatesAutoresizingMaskIntoConstraints:NO];
.
Если отключить, то работает.
Еще лучше было бы, если бы я мог получить доступ к созданным NSAutoresizingMaskLayoutConstraint
. Кто-нибудь знает, как это работает?
NSAutoresizingMaskLayoutConstraint
, которые уже созданы для меня, вместо того, чтобы отключать их и добавлять ограничения самостоятельно. Вы понимаете, что я имею в виду? - person IluTov   schedule 19.12.2012[self.view addSubview:subview];
в контроллере представления. - person IluTov   schedule 19.12.2012