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

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

Недопустимый параметр не соответствует требованиям: [ограничение isKindOfClass:[класс NSLayoutConstraint]]

- (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


person Peter Lapisu    schedule 25.09.2013    source источник


Ответы (3)


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

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

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

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

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

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.

Между прочим, я вижу так много сообщений о создании ограничений Auto Layout в коде. Interface Builder — гораздо лучший метод. Как лаконично описывает Эрика Садун в своей книге Демистификация iOS Auto Layout< /а>:

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

person Max MacLeod    schedule 25.09.2013
comment
Хорошо, но как установить ограничения для вставленного представления в IB? Поскольку вы можете манипулировать и устанавливать ограничения только для представлений, представленных в xib (вставленное представление находится в другом xib и принадлежит другому VC) - person Peter Lapisu; 25.09.2013
comment
да справедливое замечание. Для тех я создаю представление контейнера в Xib, а затем программно добавляю в подпредставление, созданное из другого Xib. Просто сделать его вровень с контейнером. Наверное, то, что вы уже делаете, я думаю - person Max MacLeod; 25.09.2013

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

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

а также

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

So,

constraintsWithVisualFormat 

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

addConstraints
person saneryee    schedule 24.11.2015

person    schedule
comment
Я думаю, что -layoutIfNeeded - это метод NSWindow. Должен ли я позвонить [containerView.window layoutIfNeeded] или [containerView layoutSubtreeIfNeeded], или это имеет значение? - person Ben Stock; 21.07.2014
comment
по моему опыту вызова layoutIfNeeded было достаточно - person Peter Lapisu; 01.08.2014
comment
вы также можете обратиться к stackoverflow. ком/вопросы/20609206/ - person Peter Lapisu; 01.08.2014