У меня есть ряд зрения сложены таким образомAnimate с autolayout
________________
| |
| View 1 |
|________________|
| |
| View 2 |
|________________|
| |
| View 3 |
|________________|
Эти представления могут быть расширены и рухнула, так что если View 1 расширяется, View 2 имеет свою вершину в нижней части View 1, и то же самое для зрения 3, связанного с видом 2.
________________
| |
| View 1 |
| |
| |
| |
|________________|
| |
| View 2 |
|________________|
| |
| View 3 |
|________________|
________________
| |
| View 1 |
|________________|
| |
| View 2 |
| |
| |
| |
|________________|
| |
| View 3 |
|________________|
Я не могу добавить эти представления через IB, так как эта схема создается dinamycally так что я должен добавить точку через код и ограничение тоже.
Я делаю это
UIView *previousView = nil;
for (UIView *view in views) {
if (previousView) {
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[previousView][view]"
options:0
metrics:nil
views:NSDictionaryOfVariableBindings(previousView, view)];
[superview addConstraints:constraints];
}
}
Когда я нажимаю вид, чтобы развернуть его, я получаю сообщение об ошибке
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)
(
"<NSAutoresizingMaskLayoutConstraint:0x76407b0 h=&-& v=--& V:[MyView:0x764c0f0(44)]>",
"<NSAutoresizingMaskLayoutConstraint:0x763e370 h=&-& v=--& V:[MyView:0x7646490(44)]>",
"<NSLayoutConstraint:0x76440d0 V:[MyView:0x764c0f0]-(0)-[MyView:0x7648eb0]>",
"<NSLayoutConstraint:0x7643920 V:[MyView:0x7648eb0]-(0)-[MyView:0x7646490]>",
"<NSAutoresizingMaskLayoutConstraint:0x76407f0 h=&-& v=--& MyView:0x764c0f0.midY == + 22>",
"<NSAutoresizingMaskLayoutConstraint:0x76d9ea0 h=&-& v=--& MyView:0x7648eb0.midY == + 91.5>",
"<NSAutoresizingMaskLayoutConstraint:0x763e3b0 h=&-& v=--& MyView:0x7646490.midY == + 110>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7643920 V:[MyView:0x7648eb0]-(0)-[MyView:0x7646490]>
Очевидно, что я делаю это неправильно. Должен ли я установить setTranslatesAutoresizingMaskIntoConstraints
на NO
и добавить свои собственные ограничения для позиционирования? Или проблема - это ограничение, которое я добавляю в этот цикл?
Благодаря @mluisbrown, я буду следовать ваше предложение. Во всяком случае, я перехожу из пружин и расположений в автоматический макет (iOS6, а не 7), и это немного сложно сделать в коде (с IB довольно просто). У вас есть ссылка, какой-то код или учебник, чтобы проиллюстрировать, как позиционировать эти представления, используя ограничения в коде? Огромное спасибо заранее. – emenegro
Я использую в основном IB, но независимо от того, используете ли вы IB или нет, я настоятельно рекомендую прочитать сообщение [Ole Begemann] (http://stackoverflow.com/users/116862/ole-begemann) [10 вещей, которые вам нужно знать Cocoa Autolayout] (http://oleb.net/blog/2013/03/things-you-need-to-know-about-cocoa-autolayout/), концепции универсальны.Документы Apple на [языке Visual Format] (https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3 -SW1) дает вам обзор синтаксиса и способ его использования. – mluisbrown