CAShapeLayer.isHidden 在 swift 中自动应用动画

CAShapeLayer.isHidden automatically applying an animation in swift

我是 CAShapeLayers 的新手,如果这是一个明显的修复,请原谅我。我试图在视图向上移动时与 UIScrollView 同步移动一条线,但在滚动视图向下移动时保持该线静止。我正在使用委托来检测滚动视图何时移动,这是我在可见行之间切换的代码。

func scrollViewDidScroll(_ scrollView: UIScrollView){
    if(mainScrollView.contentOffset.y < CGFloat(0.0)){
        topMainContentViewLine!.isHidden = false
        largeRocketImageView!.isHidden = true
        topViewLine!.isHidden = true
    }else if(mainScrollView.contentOffset.y == CGFloat(0)){
        topMainContentViewLine!.isHidden = false
        topViewLine!.isHidden = false
    }else{
        largeRocketImageView!.isHidden = false
        topMainContentViewLine!.isHidden = true
        topViewLine!.isHidden = false
    }
}

当我 运行 我的应用程序时,我可以很容易地看到两条线正在淡入和淡出,而不是立即出现和消失。为了比较图像没有动画。关于如何摆脱动画的任何想法?再次感谢!

来自文档:

https://developer.apple.com/documentation/quartzcore/calayer/1410838-ishidden

isHidden

A Boolean indicating whether the layer is displayed. Animatable.

看到“动画”这个词了吗?那是一个相当紧的shorthand;这意味着当您在不是 UIView 的底层支持层(例如任何独立子层)的层上设置此 属性 时, 动画是默认值 。那叫隐层动画.

如果在那种情况下想要可动画属性的动画,您可以通过调用

关闭动画
CATransaction.setDisableActions(true)

您可以为特定的显式事务块(即匹配 begin()commit() 命令之间的所有内容)或为运行所有代码的整个隐式事务执行此操作。

更常见的是,如果您总是或大部分时间需要一个图层,您可以将其托管为自定义 UIView 的底层。在这种情况下,设置动画 属性 将 而不是 动画,如果您需要动画,您将使用显式 CAAnimation(或 UIView 动画)来获取它。

For comparison the image has no animation

因为largeRocketImageView本身不是一层;这是一个观点。