github:https://github.com/potato512/SYDemo_Masonry
masonry适配中,animation动画的使用通常是需要更新UI,即需要更新约束,或是修改更新某一个约束mas_updateConstraints,又或是移除之前所有的约束,修改所有约束mas_remakeConstraints。更新约束后,需要刷新UI布局时,需要调用下面的方法
- (void)setNeedsLayout;
- (void)layoutIfNeeded;
- (void)setNeedsUpdateConstraints;
情况1:实例化UI后,先通过mas_makeConstraints添加约束,然后再通过mas_updateConstraints修改更新某一个约束,然后再调用layoutIfNeeded
// 1 添加约束
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
// 2 修改更新约束
[view mas_updateConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(originTop);
make.left.mas_equalTo(originLeft);
}];
// 3 调用更新
[self.view layoutIfNeeded];
情况2:实例化UI后,先通过mas_makeConstraints添加约束,然后再通过mas_remakeConstraints重置所有约束,然后再调用layoutIfNeeded
// 1 添加约束
[view mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
// 2 重置所有约束
[view mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(originTop);
make.left.mas_equalTo(originLeft);
make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
// 3 调用更新
[self.view layoutIfNeeded];
情况3:实例化UI后,暂不添加约束,后通过updateViewConstraints方法里添加约束mas_updateConstraints,然后再调用setNeedsUpdateConstraints、layoutIfNeeded
// 1
- (void)updateViewConstraints
{
[view mas_updateConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(self.sizeScale);
}];
[super updateViewConstraints];
}
// 2 调用更新
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];
效果图:
// 移动
UIButton *buttonMove = [[UIButton alloc] init];
[self.view addSubview:buttonMove];
[buttonMove mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(10);
make.left.mas_equalTo(10);
make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
[buttonMove setTitle:@"移动" forState:UIControlStateNormal];
[buttonMove setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
buttonMove.backgroundColor = RandomColor;
[buttonMove addTarget:self action:@selector(buttonMoveClick:) forControlEvents:UIControlEventTouchUpInside];
- (void)buttonMoveClick:(UIButton *)sender
{
[self.view bringSubviewToFront:sender];
CGFloat originTop = (arc4random() % ((int)self.view.frame.size.height));
if (originTop < 10)
{
originTop = 10;
}
else if (originTop > (self.view.frame.size.height - sender.frame.size.height))
{
originTop = (self.view.frame.size.height - sender.frame.size.height);
}
CGFloat originLeft = (arc4random() % ((int)self.view.frame.size.width));
if (originLeft < 10)
{
originLeft = 10;
}
else if (originLeft > (self.view.frame.size.width - sender.frame.size.width))
{
originLeft = (self.view.frame.size.width - sender.frame.size.width);
}
// 修改更新某一个约束
// [sender mas_updateConstraints:^(MASConstraintMaker *make) {
// make.top.mas_equalTo(originTop);
// make.left.mas_equalTo(originLeft);
// }];
// 或,移除之前的所有约束,重新设置约束
[sender mas_remakeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(originTop);
make.left.mas_equalTo(originLeft);
make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
[UIView animateWithDuration:0.3 animations:^{
[self.view layoutIfNeeded];
}];
}
// 放大或缩小
UIButton *buttonScale = [[UIButton alloc] init];
[self.view addSubview:buttonScale];
[buttonScale setTitle:@"放大" forState:UIControlStateNormal];
[buttonScale setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
buttonScale.backgroundColor = RandomColor;
[buttonScale addTarget:self action:@selector(buttonScaleClick:) forControlEvents:UIControlEventTouchUpInside];
buttonScale.tag = 1000;
// 方法1 先设置约束
[self scaleClick1WithUI:buttonScale];
// 方法2 暂不设置约束
// [self scaleClick2WithUI];
#pragma mark 方法1
- (void)scaleClick1WithUI:(UIButton *)button
{
[button mas_makeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(CGSizeMake(80.0, 80.0));
}];
}
- (void)scaleClick1:(UIButton *)button
{
CGSize size = button.frame.size;
if (size.height >= 160.0)
{
isScaleBig = NO;
[button setTitle:@"缩小" forState:UIControlStateNormal];
}
else if (size.height <= 80.0)
{
isScaleBig = YES;
[button setTitle:@"放大" forState:UIControlStateNormal];
}
if (isScaleBig)
{
size = CGSizeMake(button.frame.size.width * 1.2, button.frame.size.height * 1.2);
}
else
{
size = CGSizeMake(button.frame.size.width / 1.2, button.frame.size.height / 1.2);
}
// 仅修改更新某一个约束
// [sender mas_updateConstraints:^(MASConstraintMaker *make) {
// make.size.mas_equalTo(size);
// }];
// 或,清除之前的所有约束,重新设置约束
[button mas_remakeConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(size);
}];
[UIView animateWithDuration:0.3 animations:^{
[self.view layoutIfNeeded];
}];
}
#pragma mark 方法2
- (void)scaleClick2WithUI
{
self.sizeScale = CGSizeMake(80.0, 80.0);
}
- (void)updateViewConstraints
{
UIButton *button = (UIButton *)[self.view viewWithTag:1000];
[button mas_updateConstraints:^(MASConstraintMaker *make) {
make.center.equalTo(self.view);
make.size.mas_equalTo(self.sizeScale);
}];
[super updateViewConstraints];
}
- (void)scaleClick2:(UIButton *)button
{
if (self.sizeScale.height >= 160.0)
{
isScaleBig = NO;
[button setTitle:@"缩小" forState:UIControlStateNormal];
}
else if (self.sizeScale.height <= 80.0)
{
isScaleBig = YES;
[button setTitle:@"放大" forState:UIControlStateNormal];
}
if (isScaleBig)
{
self.sizeScale = CGSizeMake(self.sizeScale.width * 1.2, self.sizeScale.height * 1.2);
}
else
{
self.sizeScale = CGSizeMake(self.sizeScale.width / 1.2, self.sizeScale.height / 1.2);
}
[self.view setNeedsUpdateConstraints];
[UIView animateWithDuration:0.3 animations:^{
[self.view layoutIfNeeded];
}];
}