Подтвердить что ты не робот

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 будет полезен.

4b9b3361

Ответ 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]];