2

i am a newbie in autolayout using code.

addConstaints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-16-[v0]-16-|",options:NSLayoutFormatOptions(), metrics:nil ,views:["v0":thumbnailImageView]))

addConstaints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-16-[v0]-16-|",options:NSLayoutFormatOptions(), metrics:nil ,views:["v0":thumbnailImageView]))

Iam trying to achieve above swift code in Objective C using below code but app crashes on load with below error

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse constraint format: Expected a view H: |-16-[v0]-16-| ^'

    [self addConstraints:[NSLayoutConstraint 
constraintsWithVisualFormat:@"H:|-16-[v0]-16-|" 
options:0 
metrics:nil 
views:NSDictionaryOfVariableBindings(thumbnailImageView)]];

    [self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-16-[v0]-16-|" 
options:0 
metrics:nil 
views:NSDictionaryOfVariableBindings(thumbnailImageView)]];

.....

UIImageView * thumbnailImageView = [[UIImageView alloc] init];
        thumbnailImageView.backgroundColor = [UIColor greenColor];
        thumbnailImageView.translatesAutoresizingMaskIntoConstraints = false;

        [self addSubview:thumbnailImageView];


        thumbnailImageView.frame = CGRectMake(0, 0, 100, 100);
ios
  • 165
  • 1
  • 11

2 Answers2

3

NSDictionaryOfVariableBindings produces variable bindings that match your Objective-C variable names. So you need to write the constraint as

[self addConstraints:[NSLayoutConstraint 
constraintsWithVisualFormat:@"H:|-16-[thumbnailImageView]-16-|" 
options:0 
metrics:nil 
views:NSDictionaryOfVariableBindings(thumbnailImageView)]];

Or you just skip NSDictionaryOfVairableDBindings and use:

[self addConstraints:[NSLayoutConstraint 
constraintsWithVisualFormat:@"H:|-16-[v0]-16-|" 
options:0 
metrics:nil 
views:@{ @"v0" : thumbnailImageView } ];

which is a bit more like the Swift version. (Don't have compiler handy just at the moment so might be some small syntax errors in the second part. Will check ASAP).

idz
  • 12,825
  • 1
  • 29
  • 40
3

You are using wrongly the macro NSDictionaryOfVariableBindings you need to pass the variable name instead

/* This macro is a helper for making view dictionaries for +constraintsWithVisualFormat:options:metrics:views:. NSDictionaryOfVariableBindings(v1, v2, v3) is equivalent to [NSDictionary dictionaryWithObjectsAndKeys:v1, @"v1", v2, @"v2", v3, @"v3", nil]; */

 [self addConstraints:[NSLayoutConstraint 
constraintsWithVisualFormat:@"H:|-16-[thumbnailImageView]-16-|" 
options:0 
metrics:nil 
views:NSDictionaryOfVariableBindings(thumbnailImageView)]];

    [self addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|-16-[thumbnailImageView]-16-|" 
options:0 
metrics:nil 
views:NSDictionaryOfVariableBindings(thumbnailImageView)]];
Reinier Melian
  • 20,519
  • 3
  • 38
  • 55