约束和transform一起使用的坑

前一段时间由于视图需要旋转,所以使用约束进行布局,同时又需要对视图进行旋转,想要的结果是在旋转之后,能够根据设置的布局再次布局,但是没有再次布局。
先上最后的效果
这里写图片描述

实现代码如下
布局代码

- (NSLayoutConstraint *)addConstraintForView:(UIView *)subView inView:(UIView *)view constraint:(NSMutableArray *)contraints
{
    //使用Auto Layout约束,禁止将Autoresizing Mask转换为约束
    [subView setTranslatesAutoresizingMaskIntoConstraints:NO];

    NSLayoutConstraint *contraint1 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0];

    NSLayoutConstraint *contraint2 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeCenterY multiplier:1.0 constant:0.0];

    NSLayoutConstraint *contraint3 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:-10.0];
    //子view的右边缘离父view的右边缘40个像素
    NSLayoutConstraint *contraint4 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:-10.0];
    self.height = contraint4;


    NSLayoutConstraint *contraint5 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeHeight multiplier:1.0 constant:-10.0];

    //子view的右边缘离父view的右边缘40个像素
    NSLayoutConstraint *contraint6 = [NSLayoutConstraint constraintWithItem:subView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:view attribute:NSLayoutAttributeWidth multiplier:1.0 constant:-10.0];

    _p = @[contraint3, contraint4];
    _l = @[contraint5, contraint6];
    //把约束添加到父视图上
    NSArray *array = [NSArray arrayWithObjects:contraint1, contraint2, contraint3, contraint4, contraint5, contraint6, nil];

    if (contraints)
    {
        [contraints addObjectsFromArray:array];
    }
    [view addConstraints:array];
    [NSLayoutConstraint deactivateConstraints:_l];
    return contraint3;
}

旋转的时候

- (IBAction)fdsfasdf:(id)sender
{
    [NSLayoutConstraint deactivateConstraints:_p];
    [NSLayoutConstraint activateConstraints:_l];
    [UIView animateWithDuration:1 animations:^{
        self.testView.transform = CGAffineTransformMakeRotation(M_PI_2);
    }completion:^(BOOL finished) {
        NSLog(@"%d__%d__%@__%@", __LINE__, [self.testView needsUpdateConstraints], NSStringFromCGRect(self.testView.frame), NSStringFromCGRect(self.view.frame));
    }];

    NSLog(@"%d__%d", __LINE__, [self.testView needsUpdateConstraints]);
    [self.testView updateConstraintsIfNeeded];
}

最终发现是只有在frame发生改变的时候才能够重新布局,而出现上述问题的原因在于,布局的参照视图没有发生旋转,而布局的视图发生旋转,这样就造成参照出错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值