Я не смог выполнить миграцию моего приложения из Autoresize в механизм Autolayout. Все, что мне нужно - это представление с динамическим размером и областями, которые будут подключены к верхнему углу hte с тем же размером, что и их супервизор. В IB я установил размер для PieView (My superview) как 186x186. И пусть IB, чтобы произвести все необходимые Constraints (я буду создавать новые в коде): Resize 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];
}
Результат действительно удивил меня. Синий отображается правильно, как я хочу, но зеленый имеет странное поведение.
Конечно же у меня есть сообщение об ошибке: Не удается одновременно удовлетворяют ограничениям.
Первый 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. Любая помощь будет оценена.
Можете ли вы объяснить, какой из них является зеленый вид и который один является синий вид? Как настроена иерархия вашего представления? – axelcdv
PieView имеет 3 подзаголовка.Один из них, последний, не используется сейчас и является излишним из обсуждения. Первый imageView имеет синий фон, а второй (в середине на IB) имеет зеленый фон. Спасибо, за ответ –