Autolayout программно в подзаголовке подкласса UIView
У меня есть subclassed UIView, чтобы сделать пользовательский groupView, который я использую, чтобы добавить несколько вещей в мой макет простым способом. Этот groupView включает UILabel, который используется как заголовок и UIView, который рисует roundRect на нем CALayer с цветом фона. Подумайте о разделах UITableView. Я добавляю этот groupView в раскадровку, отбрасывая UIView и меняя его класс на мой подкласс. Все работает хорошо, я задал заголовок через пользовательские атрибуты времени выполнения в Xcode. Все отлично работает, я добавляю UILabels к этому представлению на раскадровке, и он создает ярлык заголовка и округляет его, когда он запускается.
структура моего groupView:
- groupView: (UIView) clipToBounds: НЕТ;
- заголовок: (UILabel) позиционируется
над groupView.
- contentView: (UIView) создает roundRect
и цвет через CALayer, должен иметь тот же размер, что и groupView.
Так в чем проблема? Ну, работа с autolayout - это боль, но для этого подкласса UIView мне нужно установить программные ограничения contentView. Я не могу понять синтаксис этой строки формата ASCII автоматического макета. В настоящее время у меня есть:
_contentView = [[UIView alloc]initWithFrame:self.bounds];
_contentView.layer.cornerRadius = 5.0f;
_contentView.layer.masksToBounds=YES;
_contentView.backgroundColor=_backgroundColor;
_contentView.layer.borderWidth=_borderWidth;
_contentView.layer.borderColor=_borderColor.CGColor;
[self insertSubview:_contentView atIndex:0];
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(self,_contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"[self]-0-[_contentView]-0-[self]" options:0 metrics:nil views:viewsDictionary];
for (NSLayoutConstraint *constraint in constraints) {
[_contentView addConstraint:constraint];
}
Сбой: * Завершение приложения из-за неотображенного исключения "NSGenericException", причина: "Невозможно установить ограничение на просмотр. Сдерживает ли ссылка что-то извне поддерева представления? Это незаконно. constraint: view: > '
Я пробовал это первым, и он все еще не работал:
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(_contentView);
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[_contentView]-0-|" options:0 metrics:nil views:viewsDictionary];
Сбой: * Завершение приложения из-за неотображенного исключения "NSGenericException", причина: "Невозможно установить ограничение на просмотр. Сдерживает ли ссылка что-то извне поддерева представления? Это незаконно. constraint: view: > '
RANT: Как-то этот AutoLayout должен сэкономить нам работу, но Я не вижу, как выгоды из веса накладные сейчас. Зачем на земле они перешли от использования ссылок и методов или даже типа defs для этой строки архаичного формата? Насколько это было бы проще: [_contentView constraint: NSLayoutFormatAlignLeading toView: self withDistance: 0.0f]; Или что-то подобное? Я бы очень хотел с пружинами и стойками в этот момент.
Любая помощь в понимании или показ мне синтаксиса для ограничения содержимогоView до размера self будет полезен.
Ответы
Ответ 1
Ошибка сообщает вам, что вам нужно знать:
Сдерживает ли ссылка что-то извне поддерева представления?
Да, да. Он ссылается на его супервизор.
Эти ограничения, которые вы требуете, должны применяться к супервизу, в этом случае groupView
.
Ответ 2
The | символ представляет собой супервизор на языке визуального формата, поэтому я думаю, что вы хотите:
@"|-0-[_contentView]-0-|"
а затем вам нужно добавить ограничение на self вместо contentView, так как вам нужно добавить его в представление, которое может видеть всех вовлеченных игроков.
Вот ссылка на визуальный язык:
https://developer.apple.com/library/mac/#documentation/UserExperience/Conceptual/AutolayoutPG/Articles/formatLanguage.html#//apple_ref/doc/uid/TP40010853-CH3-SW1
Вы также можете полностью избежать визуального формата, используя:
+(id)constraintWithItem:(id)view1 attribute:(NSLayoutAttribute)attr1 relatedBy:(NSLayoutRelation)relation toItem:(id)view2 attribute:(NSLayoutAttribute)attr2 multiplier:(CGFloat)multiplier constant:(CGFloat)c
Ответ 3
попробуйте проверить конструкторы, правильно ли они добавляются в представление
например:
UIView *yellowView = [[UIView alloc] init];
yellowView.backgroundColor = [UIColor yellowColor];
yellowView.translatesAutoresizingMaskIntoConstraints = false;
[self.view addSubview:yellowView];
//ios 9 last
NSLayoutConstraint *heightAnchor = [yellowView.heightAnchor constraintEqualToAnchor:self.purView.heightAnchor];
// addConstraints
[self.view addConstraints:@[heightAnchor]];
[self.view setNeedsLayout];
если добавить heightAnchor to
yellowView
, как показано ниже. он покажет ошибку
[yellowView addConstraints: @[heightAnchor]];