2013-10-08 4 views
0

Я не смог выполнить миграцию моего приложения из Autoresize в механизм Autolayout. Все, что мне нужно - это представление с динамическим размером и областями, которые будут подключены к верхнему углу hte с тем же размером, что и их супервизор. В IB я установил размер для PieView (My superview) как 186x186. И пусть IB, чтобы произвести все необходимые Constraints (я буду создавать новые в коде): Interface builder. Constraints described only for scroll viewResize subviews в визуальной форме Autolayout

PieView.m -updateConstraints()

- (void)updateConstraints { 
[super updateConstraints]; 
[self removeConstraintsAffectingViewAndSubviews]; 
[self setTranslatesAutoresizingMaskIntoConstraints:NO]; 

CGFloat sizeCoef = 0.7f; 
CGFloat percent = [self.category getFillinPercent]/100.0f; 
percent = percent > 1.0f ? 1.0f : percent; 
sizeCoef += (1.0f - sizeCoef) * percent; 

NSLayoutConstraint *width = [NSLayoutConstraint constraintWithItem:self 
                 attribute:NSLayoutAttributeWidth 
                 relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                 attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0f 
                  constant:100.f];//kDiameter * sizeCoef]; 

NSLayoutConstraint *height = [NSLayoutConstraint constraintWithItem:self 
                  attribute:NSLayoutAttributeHeight 
                  relatedBy:NSLayoutRelationEqual 
                  toItem:nil 
                  attribute:NSLayoutAttributeNotAnAttribute 
                 multiplier:1.0f 
                  constant:100.0f];//kDiameter * sizeCoef]; 
//_imgEmptyCircle, _imgFullCircle - UIImageViews 
NSDictionary *views = NSDictionaryOfVariableBindings(_imgEmptyCircle, _imgFullCircle, self); 
NSDictionary *metrics = @{@"height":@100.0}; 

[self addConstraints:@[width, height]]; 

NSString *visualForm = @"H:|[_imgEmptyCircle(height)][_imgFullCircle(height)]|"; 
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:visualForm 
                    options:0 
                    metrics:metrics 
                     views:views]; 
visualForm = @"V:|[_imgEmptyCircle(height)][_imgFullCircle(height)]|"; 
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:visualForm 
                     options:0 
                     metrics:metrics 
                     views:views]; 
[self addConstraints:verticalConstraints]; 
[self addConstraints:horizontalConstraints]; 

}

Результат действительно удивил меня. Синий отображается правильно, как я хочу, но зеленый имеет странное поведение.

Blue is the _imgEmptyCircle, green is the _imgFullCircle

Конечно же у меня есть сообщение об ошибке: Не удается одновременно удовлетворяют ограничениям.
Первый ImageView:
NSIBPrototypingLayoutConstraint: 0xa2795d0 'ИБ автоматически генерируется во время сборки для просмотра с фиксированной рамкой' V: [UIImageView: 0x8a37150 (186)]>
NSLayoutConstraint: 0xa0305c0 V: [UIImageView: 0x8a37150 (100) ]
Второй ImageView:
тот же самый
Возможная для PieView:
( NSLayoutConstraint: 0x8a40750 V: [CEPieView: 0x8a36e50 (100)], NSLayoutConstraint: 0xa030570 V: | - (0) - [UIImageView: 0x8a37150] (Название с: '|': CEPieView: 0x8a36e50), NSLayoutConstraint: 0xa0305c0 V: [UIImageView: 0x8a37150 (100)], NSLayoutConstraint: 0xa0305f0 V: [UIImageView: 0x8a37150] - (0) - [UIImageView: 0xa277cf0]> NSLayoutConstraint : 0xa030620 V: [UIImageView: 0xa277cf0 (100)], NSLayoutConstraint: 0xa030650 V: [UIImageView: 0xa277cf0] - (0) - | (Имена: '|': CEPieView: 0x8a36e50) )

Пожалуйста, дайте мне совет, как исправить это. Как создать и старую маску авторезистировки (UIViewAutoresizingFlexibleHeight, UIViewAutoresizingFlexibleWidth) с помощью механизма AutoLayout. Любая помощь будет оценена.

+0

Можете ли вы объяснить, какой из них является зеленый вид и который один является синий вид? Как настроена иерархия вашего представления? – axelcdv

+0

PieView имеет 3 подзаголовка.Один из них, последний, не используется сейчас и является излишним из обсуждения. Первый imageView имеет синий фон, а второй (в середине на IB) имеет зеленый фон. Спасибо, за ответ –

ответ

0

То, как вы устанавливаете ограничения, неверно. В основном вы запрашиваете, чтобы супервизор составлял 100pts на 100pts и содержал два подзапроса, каждый из которых составлял 100pts на 100pts и находился рядом друг с другом. Поэтому сначала ваш супервизор должен быть шириной 200pts и/или высотой, и тогда у вас не может быть двух видов, которые находятся как друг над другом, так и сверху. Что вы действительно хотите сделать (я думаю) оказывает:

NSString *visualForm = @"H:|[_imgFullCircle]|"; // No need to explicitly set the height 

Затем добавить соответствующее ограничение, то:

visualForm = @"H:|[_imgEmptyCircle(height)]|"; 

И добавить еще одно ограничение для этого, и сделать то же самое для вертикальных ограничений ,

В основном вы в конечном итоге с:

//_imgEmptyCircle, _imgFullCircle - UIImageViews 
NSDictionary *views = NSDictionaryOfVariableBindings(_imgEmptyCircle, _imgFullCircle, self); 

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imgEmptyCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_imgFullCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]];                  
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imgEmptyCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]]; 
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_imgFullCircle]|" 
                   options:0 
                   metrics:nil 
                    views:views]];  
+0

Спасибо, я понимаю, что было не так с моей Visual Format. Но я хочу динамически изменять размер супервизора. Вызов '[self addConstraints: @ [ширина, высота]];' из моего кода выше после того, как ваши ограничения не работают. Итак, в моем случае я хочу изменить размер супервизора с 186x186 в IB до 100x100 в коде и авторезистировать subviews (100x100 тоже). Спасибо! –

+0

Как это не работает? Какой результат это дает вам? Обычно это должно работать, так как подчиненные объекты ограничены тем же размером, что и супервизор (вы также можете напрямую определить это в IB). – axelcdv

+0

Итак, супервизор остается того же размера, что и в IB. Мой код: '.... [self addConstraints: [Ограничения NSLayoutConstraintWithVisualFormat: @" V: | [_imgFullCircle] | " опции: 0 показатели: ноль просмотров: просмотров]]; [самоуправления addConstraints: @ [ширина, высота]]; ' ** Скриншот ** http://s16.postimg.org/rk14u68ut/Screen_Shot_2013_10_08_at_3_55_49_PM.png –

Смежные вопросы