Ограничение автоматического макета: как заставить представление сохранять соотношение ширины / высоты при изменении размера?

В построителе интерфейса мы можем закрепить высоту, ширину булавки, сделать ширину двух представлений одинаково, но как мне установить ограничения, чтобы при изменении размера представления сохранялось соотношение ширины и высоты?

В моем конкретном случае у меня есть UIImageView в моем контроллере представления. При изменении размера представления я хотел бы, чтобы размер представления изображения изменился, но сохранил соотношение ширины и высоты 3: 2. Можно ли это сделать в ИБ? Можно ли это сделать с помощью кода?

Спасибо!


person Joseph Lin    schedule 07.01.2013    source источник


Ответы (3)


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

person rudi    schedule 15.03.2014
comment
определенно это правильный ответ. однако, если вам не нравится способ перетаскивания элементов управления, щелкните второй значок в правом нижнем углу конструктора интерфейса (тот, который с квадратом в центре) и обязательно установите флажок «Соотношение сторон». - person valvoline; 16.10.2014

Я не думаю, что вы можете сделать это в IB, но в коде это можно сделать следующим образом (iv - мой выход для просмотра изображений):

    [self.iv removeConstraints:self.iv.constraints];
    NSLayoutConstraint *con1 = [NSLayoutConstraint constraintWithItem:self.iv attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1  constant:100];
    NSLayoutConstraint *con2 = [NSLayoutConstraint constraintWithItem:self.iv attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self.iv attribute:NSLayoutAttributeWidth multiplier:.66 constant:0];
    [self.iv addConstraints:@[con1,con2]];

Это явно устанавливает высоту 100 и отношение ширины к высоте 3: 2.

person rdelmar    schedule 07.01.2013
comment
Спасибо! con2 - это именно то, что мне нужно. - person Joseph Lin; 07.01.2013
comment
+1 Я тоже не нашел способа сделать это IB. Я тоже делаю это с помощью кода. - person Rob; 07.01.2013
comment
Обновление: Xcode 5.1 поддерживает это в IB (наконец). - person Joseph Lin; 18.03.2014
comment
Я думаю, что сообщение @rudi теперь должно быть помечено как принятый ответ, потому что новая версия xcode может поддерживать такое поведение. И почти все разработчики сейчас используют xcode версии 5 или выше. :) - person hqt; 13.09.2014

Это руководство от Apple действительно помогло мне - оно описывает два подхода: в одном вы отключаете AutoLayout для определенных подпредставлений и напрямую устанавливаете фреймы, а в другом вы используете чистый AutoLayout через код.

https://developer.apple.com/library/ios/technotes/tn2154/_index.html

person Dave Cole    schedule 01.05.2015