2015-04-15 2 views
3

У меня возникла странная проблема с моим NSLayoutConstraint.ios 8.3 NSLayoutAttributeNotAnAttribute crash

Я недавно обновил свой iPhone до 8.3 и использовал последний Xcode.

Приложения сбой на прошивке 8.3 и точка останов указует мне:

self.triangleTopConstraint = [NSLayoutConstraint constraintWithItem:self.triangle 
                  attribute:NSLayoutAttributeTop 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                  attribute:NSLayoutAttributeTop 
                 multiplier:1.0 
                  constant:0.0]; 

[self addConstraint:self.triangleTopConstraint]; 

, которая работала до прошивки 8.3.

Однако, я прочитал на этой странице здесь:

https://developer.apple.com/library/ios/documentation/AppKit/Reference/NSLayoutConstraint_Class/#//apple_ref/c/tdef/NSLayoutAttribute

Это говорит использовать NSLayoutAttributeNotAnAttribute, когда отношения не имеют второго вида. Поэтому я заменил его на это:

self.triangleTopConstraint = [NSLayoutConstraint constraintWithItem:self.triangle 
                  attribute:NSLayoutAttributeTop 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                  attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0 
                  constant:0.0]; 

[self addConstraint:self.triangleTopConstraint]; 

Но приложение все еще терпит крах на iOS 8.3.

Я что-то упустил?

+0

Он «работал» как? Вы никогда не могли бы установить _top_ чего-то абсолютного значения. Я не знаю, что делал ваш код, но всегда было неправильно. – matt

+0

У меня есть subview, называемый треугольником, который является подчиненным пользовательским представлением. Я использую это ограничение анимации, чтобы изменить координату Y треугольника subview. Как я могу добиться того, что хочу, используя правильный путь, пожалуйста, просветите меня matt – Zhang

+0

Вы устанавливаете верхнюю часть отношения 'self.triangle' _in к чему-то другому, например, к верхней части своего супервизора (это не _have_, чтобы быть вершина супервизора, это всего лишь обычная вещь, поэтому я использую ее в качестве примера). – matt

ответ

4

Вы можете установить абсолютную высоту или ширину значение, и в этом случае вы должны использовать toItem из nil и второй attribute из NSLayoutAttributeNotAnAttribute; но вы не может установить абсолютный верх. Вы должны установить верхнюю в отношении что-то еще - например, по отношению к верхней части супервизора (не имеют, чтобы быть вершиной супервизора, это просто очень обычная вещь для этого. I используя его в качестве примера).

+0

Только ширина или высота могут быть постоянными и не относятся к какому-либо предмету. –

+0

Кстати, не допускается устанавливать множитель равным нулю, за исключением того, что firstItem является шириной или высотой. Или же это вызовет исключение, как сказал @Zhang. –