iOS 8.3 Сбой NSLayoutAttributeNotAnAttribute

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

Недавно я обновил свой iPhone до версии 8.3 и использовал последнюю версию Xcode.

Приложение падает на iOS 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];

Это работало до iOS 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.

Я что-то упускаю ?


person Zhang    schedule 15.04.2015    source источник
comment
Это работало как? Вы никогда не сможете установить для top абсолютное значение. Я не знаю, что делал ваш код, но он всегда был неправильным.   -  person matt    schedule 15.04.2015
comment
У меня есть подвид под названием треугольник, который является подвидом пользовательского представления. Я использую это ограничение анимации, чтобы изменить координату Y подвида треугольника. Как мне достичь того, чего я хочу, используя правильный путь, пожалуйста, просветите меня, Мэтт   -  person Zhang    schedule 15.04.2015
comment
Вы устанавливаете вершину self.triangle по отношению к чему-то другому, например к вершине своего суперпредставления (оно не обязательно должно быть вершиной суперпредставления, это просто особенно распространенная вещь, поэтому я использую ее в качестве примера).   -  person matt    schedule 15.04.2015
comment
Также, пожалуйста, спрашивая о сбое, покажите консольное сообщение, сгенерированное сбоем. Он часто полон важной информации!   -  person matt    schedule 15.04.2015
comment
Ах... сахар. Кажется, теперь я вспомнил. Я запутался с назначением значения высоты для NSLayoutConstraint, которое не равно другому представлению, поэтому я бы использовал nil. Спасибо, что разбудил меня, Мэтт. Если вы опубликуете свой комментарий как ответ, я отмечу его как принятый. Консольного вывода не было, Xcode просто рекурсивно останавливался на int main() {}.   -  person Zhang    schedule 15.04.2015


Ответы (1)


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

person matt    schedule 15.04.2015
comment
Только ширина или высота могут быть постоянными и не относятся к какому-либо элементу. - person DawnSong; 05.06.2015
comment
Кстати, нельзя устанавливать множитель равным нулю, за исключением того, что firstItem является шириной или высотой. В противном случае это вызовет исключение, как сказал @Zhang. - person DawnSong; 05.06.2015