Пользовательское соотношение сторон с AutoLayout

Допустим, у меня есть UIView, который содержит дочерний UIView, который должен быть 4:3. Я хочу решить эту проблему, используя AutoLayout в коде.

Я боролся с AutoLayout, но я еще не понял, как это сделать.

Вы знаете, как решить эту проблему?

Большое тебе спасибо.

Я прилагаю изображение, чтобы лучше объяснить, что я имею в виду. http://d.pr/i/d0Oc


person JaviAlgaba    schedule 20.09.2012    source источник


Ответы (3)


Я понял.

//Given a childView... 
NSLayoutConstraint *constraint =[NSLayoutConstraint
                           constraintWithItem:childView
                           attribute:NSLayoutAttributeWidth
                           relatedBy:NSLayoutRelationEqual
                           toItem:childView
                           attribute:NSLayoutAttributeHeight
                           multiplier:4.0/3.0 //Aspect ratio: 4*height = 3*width
                           constant:0.0f];
            [childView addConstraint:constraint];
person JaviAlgaba    schedule 21.09.2012
comment
Можно ли это сделать и из конструктора интерфейсов? - person fabb; 18.09.2014
comment
Да, это с Xcode 6! В Pin Tool теперь есть опция Aspect. - person fabb; 18.09.2014
comment
Я думаю, что нужно поменять местами NSLayoutAttributeHeight и NSLayoutAttributeWidth. Сейчас там написано 3:4, а не 4:3. - person Evgenii; 18.11.2014
comment
Кроме того, стоит добавить сюда то, что вы не можете изменить множитель ограничений после их создания — свойство множителя доступно только для чтения. Нельзя изменить множитель даже с помощью ключевых путей. Чтобы продолжить, нужно удалить имеющееся ограничение и воссоздать его с новым множителем. - person D6mi; 18.01.2016

Вот синтаксис для Swift 3:

NSLayoutConstraint(
  item: item,
  attribute: .width,
  relatedBy: .equal,
  toItem: item,
  attribute: .height,
  multiplier: width / height,
  constant: 0)
person user1615898    schedule 19.03.2017

Я попробовал все ответы выше, но не сработал, и это мое решение с быстрым 3:

let newConstraint = NSLayoutConstraint(item: yourView, attribute: .width, relatedBy: .equal, toItem: yourView, attribute: .height, multiplier: 560.0/315.0, constant: 0)
yourView.addConstraint(newConstraint)
NSLayoutConstraint.activate([newConstraint])  
NSLayoutConstraint.deactivate(yourView.constraints)
yourView.layoutIfNeeded()
person tuandapen    schedule 25.09.2017