Я пытаюсь понять это с прошлой недели, не продвигаясь дальше. Хорошо, так что мне нужно применить некоторые ограничения программно в Свифта к UIView
используя этот код:
var new_view:UIView! = UIView(frame: CGRectMake(0, 0, 100, 100));
new_view.backgroundColor = UIColor.redColor();
view.addSubview(new_view);
var constX:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0);
self.view.addConstraint(constX);
var constY:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1, constant: 0);
self.view.addConstraint(constY);
var constW:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0);
self.view.addConstraint(constW);
var constH:NSLayoutConstraint = NSLayoutConstraint(item: new_view, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: new_view, attribute: NSLayoutAttribute.Height, multiplier: 1, constant: 0);
self.view.addConstraint(constH);
Но Xcode возвращает этот странный вывод:
2014-10-03 09:48:12.657 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea4516c0 h=--& v=--& UIView:0x7fa4ea429290.midX == + 50>",
"<NSLayoutConstraint:0x7fa4ea452830 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fa4ea4470f0(375)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea446db0 h=-&- v=-&- 'UIView-Encapsulated-Layout-Left' H:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea446830 UIView:0x7fa4ea429290.centerX == UIView:0x7fa4ea4470f0.centerX>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in
<UIKit/UIView.h> may also be helpful.
2014-10-03 09:48:12.658 Test[35088:2454916] Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints)
(
"<NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea451b30 h=--& v=--& UIView:0x7fa4ea429290.midY == + 50>",
"<NSLayoutConstraint:0x7fa4ea44cf00 'UIView-Encapsulated-Layout-Height' V:[UIView:0x7fa4ea4470f0(667)]>",
"<NSAutoresizingMaskLayoutConstraint:0x7fa4ea452700 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' V:|-(0)-[UIView:0x7fa4ea4470f0] (Names: '|':UIWindow:0x7fa4ea444b20 )>"
)
Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fa4ea44d160 UIView:0x7fa4ea429290.centerY == UIView:0x7fa4ea4470f0.centerY>
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
Вы можете помочь мне? большое спасибо
ios
swift
uiview
autolayout
nslayoutconstraint
Сара Кандуччи
источник
источник
>
. Я исправил это для тебя на этот раз.Ответы:
Планируете ли вы иметь квадрат
UIView
из ширины: 100 и высота: 100 центрируется внутриUIView
АнUIViewController
? Если это так, вы можете попробовать один из 6 следующих стилей автоматического макета (Swift 5 / iOS 12.2):1. Использование
NSLayoutConstraint
инициализатора2. Использование языка визуального формата
3. Использование сочетания
NSLayoutConstraint
инициализатора и языка визуальных форматов4. Использование
UIView.AutoresizingMask
Примечание. Пружины и распорки будут преобразованы в соответствующие ограничения автоматического размещения во время выполнения.
5. Использование
NSLayoutAnchor
6. Использование
intrinsicContentSize
иNSLayoutAnchor
Результат:
источник
newView.centerXAnchor.constraintEqualToAnchor(view.centerXAnchor).active = true
newView.translatesAutoresizingMaskIntoConstraints = false
часть! Это заняло у меня некоторое время, чтобы увидеть.Это помогает мне учиться визуально, так что это дополнительный ответ.
Код котельной
Каждый из следующих примеров не зависит от других.
Закрепить левый край
myView.leading = leadingMargin + 20
Способ 1: стиль привязки
leadingAnchor
, есть такжеtrailingAnchor
,topAnchor
иbottomAnchor
.Способ 2: стиль NSLayoutConstraint
.leading
есть также.trailing
,.top
и.bottom
..leadingMargin
есть также.trailingMargin
,.topMargin
и.bottomMargin
.Установите ширину и высоту
width = 200
height = 100
Способ 1: стиль привязки
Способ 2: стиль NSLayoutConstraint
Центр в контейнере
myView.centerX = centerX
myView.centerY = centerY
Способ 1: стиль привязки
Способ 2: стиль NSLayoutConstraint
Ноты
NSLayoutConstraint
стилем, однако он доступен только в iOS 9, поэтому, если вы поддерживаете iOS 8, вам все равно следует использоватьNSLayoutConstraint
Style.myView
в моем тестовом проекте мне нужно было иметь четыре ограничения.Дальнейшее чтение
источник
leading
противcenterX
ограничений должен быть указан.addConstraint()
ONview
для того , чтобы сделать layoutconstraints зарегистрироваться.Если вы хотите заполнить свой супер вид, то я предлагаю быстрый способ:
В противном случае, если вам нужны неравные ограничения, проверьте NSLayoutAnchor начиная с iOS 9. Это часто намного легче прочитать, используя NSLayoutConstraint напрямую:
источник
isActive = true
это не всегда хорошая идея. Лучше и эффективнее сгруппировать связанные ограничения в одно и активировать их все сразу, используяNSLayoutConstraint.activate
.Ограничения для нескольких просмотров на детской площадке.
быстрый 3+
источник
Проблема, как следует из сообщения об ошибке, состоит в том, что у вас есть ограничения типа,
NSAutoresizingMaskLayoutConstraints
которые конфликтуют с вашими явными ограничениями, посколькуnew_view.translatesAutoresizingMaskIntoConstraints
установлено значение true.Это настройка по умолчанию для представлений, которые вы создаете в коде. Вы можете отключить его так:
Кроме того, ваши ограничения по ширине и высоте странные. Если вы хотите, чтобы вид имел постоянную ширину, это правильный путь:
(Замените 100 на ту ширину, которую хотите.)
Если ваша цель развертывания - iOS 9.0 или новее, вы можете использовать этот более короткий код:
В любом случае, для такого макета (с фиксированным размером и по центру в родительском представлении) было бы проще использовать маску с автоматическим изменением размера и позволить системе преобразовать маску в ограничения:
Обратите внимание, что использование автоматического изменения размера вполне допустимо, даже если вы также используете автоматическое расположение. (UIKit все еще использует автоматическое изменение размера во многих местах внутри.) Проблема в том, что трудно применить дополнительные ограничения к представлению, которое использует автоматическое изменение размера.
источник
В основном это включало 3 шага
Это помещает ярлык «Привет, мир» в центр экрана.
Пожалуйста, обратитесь ссылку на ограничения Autolayout программно
источник
Обновлено для Swift 3
Тип ограничений
источник
Авто макет реализуется путем наложения ограничений на изображения. Используйте NSLayoutConstraint. Можно реализовать идеальный и красивый дизайн на всех устройствах. Пожалуйста, попробуйте код ниже.
источник
это немного отличается в xcode 7.3.1. это то, что я придумала
источник
Хотелось бы добавить теоретическую концепцию к ответу Иману Пети, чтобы понять, как работает автоматическая разметка.
Чтобы понять автоматическую компоновку, рассмотрите ваш вид как резиновый объект, который изначально сжимается.
Для размещения объекта на экране нам нужно 4 обязательных элемента:
Координата X объекта (горизонтальное положение).
Координата Y объекта (вертикальное положение)
Ширина объекта
Высота объекта.
1 X-координата: существует несколько способов задания х-координат для вида.
Например, Ведущее ограничение, Трейлинг-ограничение, Горизонтальный центр и т. Д.
2 Координата Y: существует несколько способов задания координат y:
Например, ограничение сверху, ограничение снизу, вертикальный центр и т. Д.
3 Ширина объекта: существует два способа задания ширины для вида:
а. Добавьте фиксированное ограничение ширины (рассмотрите это ограничение как железный прут фиксированной ширины, и вы зацепили им объект вашей резины горизонтально, чтобы объект резины не сжимался и не расширялся)
б. Не добавляйте никаких ограничений по ширине, но добавьте ограничение по координатам x к обоим концам и в начале конца вида, эти два ограничения будут расширять / уменьшать объект вашей резины, вытягивая / толкая его как с конца, так и с начала и конца.
4 Высота объекта: аналогично ширине, есть также два способа ограничения высоты вида:
а. Добавьте фиксированное ограничение высоты (рассмотрите это ограничение как железный прут фиксированной высоты, и вы зацепили его резиновый объект вертикально, чтобы резиновый объект не сжимался и не расширялся)
б. Не добавляйте никаких ограничений по высоте, но добавьте ограничение по координатам x к обоим концам вида сверху и снизу, эти два ограничения будут расширять / уменьшать объект вашей резины, вытягивая / толкая его с обоих концов, сверху и снизу.
источник
источник
Это один из способов добавления ограничений программно
источник
Вы добавляете все определенные ограничения, для
self.view
которых неправильно, так как ограничения ширины и высоты должны быть добавлены к вашемуnewView
.Также, насколько я понимаю, вы хотите установить постоянную ширину и высоту 100: 100. В этом случае вы должны изменить свой код на:
источник
Если вы находите, что выше, уродливо. Вы должны рассмотреть возможность использования DSL для ограничений. Например, SnapKit делает API-интерфейс ограничений намного более удобным для пользователя
источник
Мы можем легко сделать это с помощью Swift 5.1
настройка 1
высота ширины подпредставления устанавливается с помощью float
настройка 2
ширина подпредставления устанавливается с использованием высоты ширины вида
источник
Попробуйте это элегантное
UIView
расширение для ограничений. Вы можете сделать ограничения легко как:Вот расширение, просто скопируйте его в свой проект.
источник