How does it work?
Constraints: mathematically defines the relation between 2 views
NSObject > NSLayoutConstraint
+ constraintsWithVisualFormat:options:metrics:views:
+ constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
Auto Layout is a new way to define dynamic GUIs. Before, we had autoresizing masks, that described how a subview will resize or move when its superview is resized. With Auto Layout you can do the same and also a lot more complicated GUIs quite easily.
Visual Format Language
Programmatically auto layout example:
// defined properties inside .h file
// local variables
@property (strong, nonatomic) IBOutlet UILabel *firstName;
@property (strong, nonatomic) IBOutlet UILabel *lastName;
@property (strong, nonatomic) IBOutlet UITextView *textView;
@property (strong, nonatomic) IBOutlet UIImageView *imageView;
// implementation of .m file
- (void)viewDidLoad
{
[super viewDidLoad];
[self addConstraints];
}
- (void) addConstraints {
[self.view removeConstraints:self.view.constraints];
UILabel *firstName = self.firstName;
UILabel *lastName = self.lastName;
UIImageView *imageView = self.imageView;
UITextView *comment = self.textView;
NSDictionary *views = NSDictionaryOfVariableBindings(firstName,lastName,imageView,comment);
NSDictionary *metrics = @{@"width": @160.0, @"horizontalSpacing":@15.0, @"verticalSpacing":@10};
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:
@"H:|-[imageView(100)]-horizontalSpacing-[firstName(>=width)]-|"
options:NSLayoutFormatAlignAllTop
metrics:metrics
views:views];
constraints = [constraints arrayByAddingObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:
@"H:[imageView]-horizontalSpacing-[lastName(>=width)]-|"
options:0
metrics:metrics
views:views]];
constraints = [constraints arrayByAddingObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:
@"H:[imageView]-horizontalSpacing-[comment(>=width)]-|"
options:NSLayoutFormatAlignAllBottom
metrics:metrics
views:views]];
// if you need to redefine the view, don't mention the Width Constraint again.
// if you do, it will overlap. that's why, no Width Constraint is assigned in [imageView]
constraints = [constraints arrayByAddingObjectsFromArray:
[NSLayoutConstraint constraintsWithVisualFormat:
@"V:|-50-[firstName]-verticalSpacing-[lastName]-verticalSpacing-[comment]"
options:0
metrics:metrics
views:views]];
[self.view addConstraints:constraints];
}
Reference:
No comments:
Post a Comment