Поломка NSLayoutconstraint начиная с xcode 6.3

Я пытаюсь установить приведенное ниже ограничение для одного из моих плавающих представлений.

    leftConstraint = [NSLayoutConstraint constraintWithItem:detailView 
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.0 
constant:VIEW_WIDTH];

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

Когда я запускаю указанное выше ограничение в XCode 6.3, я получаю следующую ошибку. «Множитель 0 или ноль второго элемента вместе с местоположением для первого атрибута создает недопустимое ограничение местоположения, равное константе»

Я не уверен, почему это создает незаконное ограничение.

Чтобы обойти эту проблему, я использую множитель 0,001, но он не будет работать во всех случаях. Поэтому ищите лучший обходной путь для этого требования.


person Friendtam    schedule 14.04.2015    source источник


Ответы (2)


Это формула, которую использует Autolayout:

item1.attribute1 = multiplier × item2.attribute2 + constant

Таким образом, если вы установите множитель равным 0 или у вас нет элемента 2, атрибут 1 будет равен constant. Это не очень хорошая идея, потому что это ограничение в отношении супервизора без упоминания супервизора. И в большинстве случаев это результат ошибки в коде. Поэтому Apple решила, что создавать такого рода ограничения незаконно.

Ограничения без второго элемента недействительны для всех атрибутов, кроме высоты и ширины.

На самом деле вы должны явно добавить свое ограничение в отношении супервизора представления.

Ваше ограничение должно выглядеть так

leftConstraint = [NSLayoutConstraint constraintWithItem:detailView
                    attribute:  NSLayoutAttributeLeft
                    relatedBy:  NSLayoutRelationEqual
                    toItem:     detailView.superview
                    attribute:  NSLayoutAttributeLeft 
                    multiplier: 1 
                    constant:   VIEW_WIDTH];
person Matthias Bauch    schedule 14.04.2015

Если вы хотите расположить вид слева и добавить ограничение ширины, вы должны использовать два ограничения:

CGFloat leftConstraintConstant = 40.0f;
CGFloat VIEW_WIDTH = 200.0f;

NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.view attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:detailView attribute:NSLayoutAttributeLeading multiplier:1.0 constant:leftConstraintConstant];
NSLayoutConstraint *widthConstraint = [NSLayoutConstraint constraintWithItem:detailView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:VIEW_WIDTH];

[self.view addSubview:detailView];
[self.view addConstraints:@[leftConstraint,widthConstraint]];

Чтобы правильно расположить вид, вы также должны добавить отдельное ограничение для положения оси Y и высоты. Обратите внимание, что я не тестировал этот код, но он должен дать вам краткое представление о том, что нужно сделать.

person DanielS    schedule 14.04.2015