AutoLayout下Constraint动画

在AutoLayout下,普通的约束动画不起作用。为解决这一问题,通常使用`layoutIfNeeded`方法尝试刷新以实现动画效果,但并非总能成功。一位网友提出利用bounds属性进行动画处理,通过改变bounds并随后恢复,同时调整约束,可以实现平滑的动画效果。计划进一步探索`layoutIfNeeded`在约束动画中的应用。
摘要由CSDN通过智能技术生成

Constraint的动画如果按照一般的写法,是无效的。比如:

    [UIView animateWithDuration:1.0f animations:^
    {
        _animateConstraint.constant = -180.0f;
    }]

至于是什么原因,暂时还不了解,以后会持续关注这个问题。
网络上为了解决这个约束的动画的问题,大部分用的是View的一个方法—layoutIfNeeded。大概的作用是,持续刷新,然后就有动画了,当然这是我自己的猜测。我也不是很熟悉Layout方面的内容,并且我做了这方面的尝试之后,没有成功。
在一次偶然的日常查阅中,突然有位网友提到了bounds这个属性。于是有了下面这段代码:

    CGRect originalBounds = _loginView.bounds;
    CGRect newBounds = originalBounds;
    newBounds.origin.y += 180.0f;

    [UIView animateWithDuration:0.3f animations:^
    {
        _loginView.bounds = newBounds;
    }
                     completion:^(BOOL finished)
    {
        _loginView.bounds = originalBounds;
        _animateConstraint.constant = -180.0f;
    }];

其中_loginView是需要完成动画的View,_animateConstraint是该View的约束,是距上方最近的控件的距离。

这段代码的思路是,先用bounds完成动画(为什么不用frame?自动布局里面frame是无效的?我没做过验证,不确定),但动画完成后该View处于自己有效范围外,所以动画完成之后,我将该View的bounds恢复,然后更改他的Constraint,保持在动画结束的位置,这样就比较漂亮的完成动画了。

当然,有空会试试LayoutIfNeeded来完成动画。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值