快速停止 CABasicAnimation

2024-03-03

我使用 CABasicAnimation 来制作脉冲帧等动画视图

有代码

extension UIView {
/// animate the border width
func animateBorderWidth(toValue: CGFloat, duration: Double) -> CABasicAnimation {
    let widthAnimation = CABasicAnimation(keyPath: "borderWidth")
    widthAnimation.fromValue = 0.9
    widthAnimation.toValue = 0.0
    widthAnimation.duration = 15
    widthAnimation.timingFunction = CAMediaTimingFunction(name: .easeOut)
    return widthAnimation
}

/// animate the scale
func animateScale(toValue: CGFloat, duration: Double) -> CABasicAnimation {
    let scaleAnimation = CABasicAnimation(keyPath: "transform.scale")
    scaleAnimation.fromValue = 1.0
    scaleAnimation.toValue = 12
    scaleAnimation.duration = 55
    scaleAnimation.repeatCount = .infinity
    scaleAnimation.isRemovedOnCompletion = false
    scaleAnimation.timingFunction = CAMediaTimingFunction(name: .linear)
    return scaleAnimation
}
    
func pulsate(animationDuration: CGFloat) {
    var animationGroup: CAAnimationGroup!
    let newLayer = CALayer()
    animationGroup = CAAnimationGroup()
    animationGroup.duration = CFTimeInterval(animationDuration)
    animationGroup.repeatCount = Float.infinity
    
    newLayer.bounds = CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height)
    newLayer.cornerRadius = self.frame.width/2
    newLayer.position = CGPoint(x: self.frame.width/2, y: self.frame.height/2)
    newLayer.cornerRadius = self.frame.width/2
    newLayer.borderColor = #colorLiteral(red: 0.7215686275, green: 0.5137254902, blue: 0.7647058824, alpha: 0.7).cgColor
    
        animationGroup.timingFunction = CAMediaTimingFunction(name: .easeOut)
    animationGroup.animations = [animateScale(toValue: 7.5, duration: 2.0),
                                 animateBorderWidth(toValue: 0.6, duration: Double(animationDuration))]
        animationGroup.duration = 14
    newLayer.add(animationGroup, forKey: "pulse")
    self.layer.cornerRadius = self.frame.width/2
    self.layer.insertSublayer(newLayer, at: 0)
}

func removeAnimation() {
    self.layer.sublayers?.forEach { $0.removeAnimation(forKey: "pulse") }
}

} enter image description here

并在UIViewCOntroller中添加这个动画来查看

func startPul() {
self.backPulseView.pulsate(animationDuration: 2.0)
}

但是如果我按下按钮我想停止动画并隐藏 我想

func stopPul() {
self.backPulseView.removeAnimation()
}

但动画仍然有效并且没有被删除

如何删除动画然后再次调用?

停止我通过按钮点击调用的动画

 @IBAction func stopBtn(_ sender: UIButton) {
    stopPul()
 }

删除动画迭代sublayers并删除该“脉冲”键的动画:

self.layer.sublayers?.forEach {
            $0.speed = 0
            $0.removeAllAnimations()
            $0.removeFromSuperlayer()
        }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

快速停止 CABasicAnimation 的相关文章

随机推荐

  • ruby 中最短的 hex2bin?

    在 ruby 中将十六进制字符串转换为二进制字符串的最短方法是什么 例如 class def hex2bin end end AB12345678 hex2bin class String def hex2bin scan map x x
  • JFileChooser 显示在全屏 JFrame 之外

    import java awt DisplayMode import java awt GraphicsDevice import java awt GraphicsEnvironment import java awt event Act
  • 如何更改文本块背景?

    这是我的xaml structure
  • 如何防止.exe类型文件在网站上传?

    假设我们有一个 example exe 文件 我们首先将该文件放入一个新文件夹中 然后使用任何压缩软件压缩该文件夹 我们可以阻止压缩文件夹在网站中上传吗 我们怎样才能做到这一点 你不能prevent它 因为在提交之前你无法知道浏览器将要提交
  • 为什么我获得了未分配内存的读写权限?

    我对下面代码片段的行为感到困惑 我已经声明了一个 char 指针并将其指向分配大小 1 sizeof char 的内存位置 char src src char malloc 1 sizeof char strcpy src Copy tex
  • 对 Rhino Mocks 中的方法调用进行计数

    所以 我想用比 An Ounce 或 At Least Once 更具体的方法来计算 Rhino Mocks 中的方法调用 有什么机制可以做到这一点吗 诀窍是使用 Repeat Times n 其中 n 是次数 令人惊讶的是 即使该方法的调
  • 如何在活动之前增加 Azure 数据工厂中的参数?

    我正在访问一个 RESTful API 该 API 使用 HTTP 连接器以 50 组为一组进行分页 REST 连接器似乎不支持客户端证书 因此我无法在其中使用分页 我有一个名为的管道变量SkipIndex默认为 0 在 Until 循环内
  • 行为 3 中如何在上下文之间进行通信?

    我无法再在版本 3 中使用 getMainContext 和 getSubcontext alias 版本 3 中上下文之间的通信方式是什么 上下文特征是唯一的方式吗 behat yml default suites guest featu
  • Android 中的电话选择器 api

    我正在尝试使用电话选择器 API 获取电话号码 但得到空响应 这是我的代码 GoogleApiClient googleApiClient new GoogleApiClient Builder this addApi Auth CREDE
  • Schema.org 中的产品列表

    我读了这个谷歌文档 https developers google com search docs data types products 它说我们不使用列表中的产品 那么对于产品列表 具有多页的类似产品类别 如 鞋子 建议使用哪种模式 我
  • 静态和粘性固定标题转换故障

    我创建了一个基于滚动的粘性标题 但有两个问题 上下滚动时 背景有跳跃 我希望你 明白我的意思 有时两个标题 div 一起出现 我该如何解决这个问题 提前致谢 JSFiddle 演示 http jsfiddle net ezBXc CSS m
  • 在 swift 中使用 NSClassFromString 实例化嵌套类

    我有一个如下定义的嵌套类 objc class A objc class B 我需要实例化A B using NSClassFromString 我能够在简单的课程中做到这一点A但是当我附加到NSClassFromString参数 Bstr
  • 将 GitLab 与 TeamCity 集成

    从 GitLab 7 6 或更高版本开始 有一个新选项可以直接从 GitLab 项目使用 TeamCity 在设置中有这样的消息 Teamcity 中的构建配置必须使用构建格式编号 build vcs number 您还需要配置对所有 分支
  • Android:支持多屏

    我正在尝试在Android 中制作一个应用程序 我希望它应该能够在不同屏幕尺寸的多部手机上运行 所以我研究了支持开发者多屏 http developer android com guide practices screens support
  • symfony 中“无法设置验证器上的enable_annotations,因为注释支持被禁用”

    我刚刚创建了一个包 成功 当我准备通过控制台创建一个实体时 发生了这种情况 也使用clear cache 逻辑异常 验证器上的 enable annotations 不能设置为注释 支持被禁用 mi config yml 看起来像 fram
  • 使用 OAuth 和单页应用程序实施 Web API

    我们正在开发一个 API 和一个单页应用程序 这是它未来更可能的使用者之一 我们已经开始使用 Web API 并且基本上实现了一个与 John Papa 在他的pluralsight 课程中制作的系统非常相似的系统 名为 使用 HTML5
  • 尝试使用 Fluent-ffmpeg 将帧提取到内存

    我正在尝试使用 FFmpeg 将帧直接提取到内存中 以节省将帧写入磁盘的时间 因为我不需要它 我尝试运行this https stackoverflow com questions 62050534 how to read video fr
  • 使用 $(GitVersion.NuGetVersion) 标记源会创建带有变量名称而不是值的标签

    成功构建后 将标签格式配置为 GitVersion NuGetVersion 结果标签设置为 GitVersion NuGetVersion 不是该变量的实际扩展值 在构建输出日志记录中 有 2 个部分 计划 构建和完成构建 据推测 一旦构
  • Pandas 计算列中负值的序列

    我在 Pandas Dataframe 列 B 中的值可以是正数或负数 data 5889 25 738 0 5896 5 49 0 5897 5 130 0 5899 5 266 0 5903 75 126 0 5903 75 512 0
  • 快速停止 CABasicAnimation

    我使用 CABasicAnimation 来制作脉冲帧等动画视图 有代码 extension UIView animate the border width func animateBorderWidth toValue CGFloat d