You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 11:15:00