макет для iOS авто: установить трейлинг-пространство, равное ширине суперпанель
Мне нужно расположить вид сразу за правой границей его супервизора, используя автоматическую компоновку.
Я пытаюсь сделать это, указав следующий NSLayoutConstraint:
NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.downloadView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:self.contentView
attribute:NSLayoutAttributeWidth
multiplier:1.0
constant:0.0];
Где самость.downloadView держит это подвиды себя.странице просмотр содержимого. При этом iOS жалуется со следующим исключением:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSLayoutConstraint constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:]: Invalid pairing of layout attributes'
Кто-нибудь может объяснить, почему я не могу соединить эти два атрибута и как я могу достичь своей цели?
1 ответ:
Да, вы не можете установить ведущий атрибут, связанный с атрибутом ширины
contentView
. Но вы могли бы, например, установить ведущий атрибутdownloadView
относительно конечного атрибута егоsuperview
,contentView
:NSLayoutConstraint *leftConstraint = [NSLayoutConstraint constraintWithItem:self.downloadView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.contentView attribute:NSLayoutAttributeTrailing multiplier:1.0 constant:0.0];
Или вы можете определить ведущий атрибут
downloadView
относительно ведущего атрибутаcontentView
, но затем установитьconstant
в качестве некоторого значения, такого как ширина представления. Проблема с этой техникой, правда, в том, что на ориентацию изменения,constant
больше не будет уместным, и вам, возможно, придется его корректировать.