Peter Lapisu
Peter Lapisu

Reputation: 20985

Auto layout, inserted view to fill the container view

I'am trying to make the inserted view to fill the container view in which it is inserted, however iam getting

Invalid parameter not satisfying: [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)]
                                    ]
    ];

}

Basically the one view i want to insert is loaded from a VC

Upvotes: 3

Views: 5247

Answers (3)

saneryee
saneryee

Reputation: 3405

There are two methods in UIView

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

and

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

So,

constraintsWithVisualFormat 

will return a NSArray, you need use

addConstraints

Upvotes: 2

Peter Lapisu
Peter Lapisu

Reputation: 20985

- (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];
}

Upvotes: 9

Max MacLeod
Max MacLeod

Reputation: 26652

constraintsWithVisualFormat returns an NSArray.

@[] is the Objective C literal to create an NSArray.

So, here your method parameter for addConstraints is an NSArray with two elements, each of which is an NSArray.

That's an incorrect method parameter for addConstraints. It expects an NSArray of objects of type NSLayoutConstraint.

Changing your invocation to be along the lines of this will solve the problem:

[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: etc.

Incidentally, I see so many posts about creating Auto Layout constraints in code. Interface Builder is far the superior method. As Erica Sadun so succinctly puts it in her book iOS Auto Layout Demystified:

Any views you lay out in Interface Builder are guaranteed to be satisfiable. You cannot create a wrong interface with inconsistent rules in IB. The same is not true in code.

Upvotes: 5

Related Questions