Автоматическая компоновка, вставленное представление, чтобы заполнить вид контейнера

Я пытаюсь сделать вставленное представление, чтобы заполнить вид контейнера, в который он вставлен, однако я получаю

Недопустимый параметр, не удовлетворяющий: [constraint isKindOfClass: [NSLayoutConstraint class]]

- (void)insertedView:(NSView *)insertedView needsToFillContainerView:(NSView *)containerView {
 [containerView addSubview:insertedView];
 [containerView setTranslatesAutoresizingMaskIntoConstraints:NO];
 [containerView addConstraints:@[
 [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[insertedView]|"
 options:0
 metrics:nil
 views:NSDictionaryOfVariableBindings(insertedView)],
 [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[insertedView]|"
 options:0
 metrics:nil
 views:NSDictionaryOfVariableBindings(insertedView)]
 ]
 ];
}

В принципе, один вид, который я хочу вставить, загружается из VC

3 ответа

- (void)addSubview:(NSView *)insertedView fillingAndInsertedIntoView:(NSView *)containerView {
 [containerView addSubview:insertedView];
 [insertedView setTranslatesAutoresizingMaskIntoConstraints:NO];
 [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[insertedView]|"
 options:0
 metrics:nil
 views:NSDictionaryOfVariableBindings(insertedView)]];
 [containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[insertedView]|"
 options:0
 metrics:nil
 views:NSDictionaryOfVariableBindings(insertedView)]];
 [containeView layoutIfNeeded];
}


constraintsWithVisualFormat возвращает NSArray.

@[] - это литерал Objective C для создания NSArray.

Итак, здесь ваш параметр метода для addConstraints является NSArray с двумя элементами, каждый из которых является NSArray.

Это неправильный параметр метода для addConstraints. Он ожидает NSArray объектов типа NSLayoutConstraint.

Изменение вашего вызова в соответствии с этим будет решить проблему:

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.

Кстати, я вижу так много сообщений о создании ограничений Auto Layout в коде. Интерфейс Builder далеко превосходит метод. Как Эрика Садун так лаконично помещает ее в свою книгу iOS Auto Layout Demystified:

Любые виды, которые вы выкладываете в Interface Builder, гарантированно выполняются. Вы не можете создать неправильный интерфейс с непоследовательными правилами в IB. То же самое не верно в коде.


В UIView есть два метода

//parameter type is NSArray
-(void)addConstraints:(NSArray *) constraints

и

// parameter type is NSLayoutConstraint
-(void)addConstraint:(NSLayoutConstraint *) constraint

Итак,

constraintsWithVisualFormat

вернет NSArray, вам нужно использовать

addConstraints

licensed under cc by-sa 3.0 with attribution.