swift - CAShapeLayer.isHidden 自动快速应用动画

标签 swift uiscrollview core-animation cashapelayer

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

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.

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

如果在这些情况下您想要动画属性,您可以通过调用关闭动画

CATransaction.setDisableActions(true)

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

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

For comparison the image has no animation

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

关于swift - CAShapeLayer.isHidden 自动快速应用动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49433244/

相关文章:

iphone - iOS UIScrollView : Cannot scroll until the end of the content

objective-c - 图层支持 View 和闪烁控件

iphone - 在 iOS 上,如果 CALayer 的子类与一个空的显示方法一起使用,那么应用程序似乎会进入死循环?

ios - 表格 View 中的自定义单元格不希望被舍入

ios - 像 Instagram iOS 应用一样自动隐藏和显示 UINavigationBar

swift - 如何基于类中的其他属性创建变量属性

iOS 键盘和 TextView 错误 - "use of undeclared variable"

ios - RotationMode 在 CAKeyframeAnimation(线性路径)中不起作用

ios - 在自定义键盘扩展中支持多种语言

ios - 编程约束折叠单元格 View