Reputation: 20985
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
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
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
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