Animator Proxy动画完成后NSView Frame Origin被重置问题
解决NSView动画后闪屏跳回原点的问题
嘿,这个坑我之前踩过!你猜的没错,问题根源就是Auto Layout和直接修改frame的冲突。
你用animator().setFrameOrigin()做动画的时候,只是临时把视图的frame改成了目标位置,但Auto Layout一直在后台盯着——它会根据你设置的约束重新计算视图的正确位置,动画一结束,系统就会执行布局更新,把视图强行拉回约束指定的原点,这就是你看到的闪屏现象。
直接修改frame的方式在Auto Layout环境下根本行不通,正确的做法是修改约束的constant值,让Auto Layout跟着你的动画走。具体步骤如下:
首先,找到控制这个视图Y位置的约束(比如顶部到父视图的约束、底部约束等),把它连接成代码里的
IBOutlet,比如:@IBOutlet weak var viewTopConstraint: NSLayoutConstraint!然后用动画上下文包裹约束constant的修改,用
animator()来实现平滑过渡:NSAnimationContext.beginGrouping() NSAnimationContext.current.duration = 0.5 // 假设原来的top约束constant是0,下移50点就把constant改成50(具体数值根据你的布局调整) viewTopConstraint.animator().constant = 50 NSAnimationContext.endGrouping()
这样做的好处是,动画结束后约束的constant已经是新的数值,Auto Layout会认可这个位置,不会再把视图拉回原点,自然就不会有闪屏了。
至于你之前的两种代码写法,本质上都是直接修改frame,在Auto Layout面前都会被“打回原形”,所以结果当然一样啦~
内容的提问来源于stack exchange,提问作者XYZ
相关产品推荐
相关产品推荐

