Код NSLayoutConstraints, чтобы центрировать представление и поддерживать его соотношение сторон

Я хотел бы, чтобы мой subview был прямоугольником 16: 9, центрированным в верхней части его супервизора. Другими словами, мне бы хотелось:

  1. быть таким же широким, как и надзор, но не шире 400px (пользовательский интерфейс может вращаться до ландшафта),
  2. центрироваться горизонтально, когда он уже, чем надзор,
  3. у него есть верхняя часть, прикрепленная к вершине супервизора, и
  4. измените его высоту, чтобы поддерживать соотношение сторон 16: 9.

Этот код почти делает это, за исключением того, что мне трудно выполнять горизонтальные ограничения, а не быть более или менее ограниченными …

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIView *contentView = [[UIView alloc] init]; contentView.backgroundColor = [UIColor redColor]; [self.view addSubview:contentView]; contentView.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *views = NSDictionaryOfVariableBindings(contentView); NSMutableArray *constraints = [NSMutableArray array]; // this layout string is more like 'wishful coding'. I don't see why it wouldn't work // but clearly this one is the problem [constraints addObjectsFromArray:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=0)-[contentView(<=400)-(>=0)-]" options:0 metrics:0 views:views]]; // this centering constraint below almost does the job, but doesn't give me a way // to specify width, changing the one above to just @"H:[contentView(<=400)]" // doesn't work either [constraints addObject: [NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1.f constant:0.f]]; // 9:16 works fine, I think [constraints addObject: [NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:contentView attribute:NSLayoutAttributeWidth multiplier:9.0/16.0 constant:0.0]]; // pin the tops works fine, I think [constraints addObjectsFromArray: [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[contentView]" options:0 metrics:0 views:views]]; [self.view addConstraints:constraints]; } 

3 Solutions collect form web for “Код NSLayoutConstraints, чтобы центрировать представление и поддерживать его соотношение сторон”

Если вы хотите центрировать красный квадрат по горизонтали, то вы хотите приравнять к ним «CenterX», а не CenterY. Так что ограничение должно выглядеть так:

 [NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1.f constant:0.f]]; 

Тогда при первых ограничениях ограничения, которые у вас там есть, неоднозначны, так как существует более чем один способ удовлетворения >=0 поля с каждой стороны и <=400 по ширине. Лучше всего было бы точно сказать, что вы сказали в своем вопросе, а именно, что вам нужно, чтобы ширина была <= 400, и вы хотели бы, чтобы поля были равны 0, если это возможно.

Так что-то вроде этого:

 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(0@900)-[contentView(<=400)]-(0@900)-|" options:0 metrics:0 views:views]]; 

Я верю, что ты хочешь, чтобы хочешь?

Иногда, я думаю, есть еще одно решение, я скопировал свое решение здесь.

Если вы хотите горизонтальное выравнивание, просто используйте его [parentView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];

Если вы хотите вертикальное выравнивание, просто используйте его [parentView addConstraint:[NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:parentView attribute:NSLayoutAttributeCenterY multiplier:1 constant:0]];

И это решение работает для меня, я надеюсь, что я передам его кому-то другому.

Другой путь

Objective-C

  contentView.translatesAutoresizingMaskIntoConstraints = NO; //Have it's top pinned to it's superview's top [[[contentView topAnchor] constraintEqualToAnchor:self.view.topAnchor] isActive]; //Centered horizontally when it's narrower than it's superview [[[contentView centerXAnchor] constraintEqualToAnchor:self.view.centerXAnchor] isActive]; // Width be as wide as it's superview, but no wider than 400px NSLayoutConstraint * widthConstraint = [[contentView widthAnchor]constraintLessThanOrEqualToConstant:400]; NSLayoutConstraint * widthConstraint1 = [[contentView widthAnchor]constraintEqualToAnchor:self.view.widthAnchor]; [widthConstraint setPriority:750]; [widthConstraint isActive]; [widthConstraint1 setPriority:500]; [widthConstraint1 isActive]; //Height to maintain a 16:9 aspect ratio [[[contentView heightAnchor] constraintEqualToAnchor:contentView.widthAnchor multiplier:9.0/16.0] isActive]; 

стриж

  contentView.translatesAutoresizingMaskIntoConstraints = false //Have it's top pinned to it's superview's top contentView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true //Centered horizontally when it's narrower than it's superview contentView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true // Width be as wide as it's superview, but no wider than 400px let widthConstraint = contentView.widthAnchor.constraint(lessThanOrEqualToConstant: 400) let widthConstraint1 = contentView.widthAnchor.constraint(equalTo: self.view.widthAnchor) widthConstraint.priority = 750 widthConstraint.isActive = true widthConstraint1.priority = 500 widthConstraint1.isActive = true //Height to maintain a 16:9 aspect ratio contentView.heightAnchor.constraint(equalTo: contentView.widthAnchor, multiplier: 9.0/16.0).isActive = true 
  • Как определить, поддерживается ли символ UIFont?
  • Как я могу перейти на верхний уровень UINavigationController в одном UITabBarController из другого UINavigationController в другой UITabBarController?
  • UILabel с настраиваемыми шрифтами * неправильный * пользовательский шрифт
  • Изменить контроллер отображения на вращение устройства
  • Как форматировать данные из строковой переменной
  • Как показать в UIImage только часть изображения?
  • Jquery-ui sortable не работает на сенсорных устройствах на базе Android или IOS
  • Просмотр статической таблицы вне UITableViewController
  • APNS Отправлять уведомления с нескольких серверов
  • Вращение UIView не может произойти дважды
  • Запустите фоновый поток на Swift 3
  • Interesting Posts

    FFT Pitch Detection для iOS с использованием ускорительной системы?

    Как включить / выключить автоматическую компоновку для одного контроллера представления в раскадровке

    Предотвращение белых краев при изменении ориентации

    Отслеживание вращения MKMapView

    Как перезагрузить мой UIViewController при нажатии некоторых кнопок?

    Как локализовать название UIButton?

    Как обновить приложение каждые 24 часа в объективе c

    Функция WKWebView для обнаружения изменения URL-адреса

    iPhone Wi-Fi включен или выключен?

    Почему я вижу проблему ARC, говоря, что я объявлял метод с определенным селектором?

    UIView и intCinentSize

    Явное отключение анимации UIView в iOS4 +

    NSTimer не передает аргументы селектору

    Есть ли частный API для чтения другого номера значка приложения?

    Знать, когда мастер диспетчера разделенного представления отклоняется жестом

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.