Swift中如何让UIView.animate动画在子视图而非父视图范围内执行
实现方案
要实现动画仅在父视图可视范围内展示,只需做两处核心调整:
- 开启父视图的边界裁剪属性
父视图只要开启clipsToBounds,所有子视图超出父视图边界的部分都会被自动隐藏,不会被用户看到,你可以在父视图的初始化代码或者IB面板里设置:
// 父视图相关代码中添加这一行 parentView.clipsToBounds = true
如果是用Interface Builder配置,直接勾选父视图属性面板里的Clips To Bounds选项即可。
- 修正现有代码的已知问题并优化位移逻辑
原代码中存在枚举拼写错误,同时可以优化位移计算,确保动画起始/结束位置符合预期,修正后的完整代码如下:
class AnimationView: UIView { enum Direction: Int { case fromLeft = 0 case fromRight = 1 // 修正原拼写错误FromRgiht } @IBInspectable var direction: Int = 0 @IBInspectable var delay: Double = 0.0 func animateRating() { initAnime() UIView.animate(withDuration: 1.0, delay: self.delay, options: .curveEaseOut, animations: { guard let superview = self.superview else { return } if self.direction == Direction.fromLeft.rawValue { self.center.x += self.bounds.width } else { self.center.x -= self.bounds.width } }, completion: nil) } func initAnime() { guard let superview = self.superview else { return } if direction == Direction.fromLeft.rawValue { // 起始位置调整为左边缘刚好对齐父视图左边缘外侧,裁剪后完全不可见 self.center.x -= self.bounds.width } else { // 起始位置调整为右边缘刚好对齐父视图右边缘外侧,裁剪后完全不可见 self.center.x += self.bounds.width } } }
注:如果你需要动画的起始位置完全在父视图内部,可以直接调整
initAnime中的位移距离,不用完全移动一个视图宽度。
内容的提问来源于stack exchange,提问作者Dyl
相关产品推荐
相关产品推荐

