макет для 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 3

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 больше не будет уместным, и вам, возможно, придется его корректировать.