SwiftUI:让你的边框动起来(三)—trim

有时候需要边框有线条流动的动画效果,接下来几篇文章会来探讨下不同的实现方式。本文主要是介绍第三种方式trim。

public func trim(from startFraction: CGFloat = 0, to endFraction: CGFloat = 1) -> some Shape

trim方法可以让形状显示一部分,

RoundedRectangle(cornerRadius: 20)
  .trim(from: 0, to: 0.25)
  .stroke(style: .init(lineWidth: 6, lineCap: .round))
  .foregroundStyle(.indigo)
  .frame(width: 200, height: 200)

比如上面这段代码就可以只显示矩形边框的前1/4
截屏2024-09-28 17.43.17.png
所以要实现边框流动的效果很直接的一个思路就是让start和end保持一个固定的距离往前推进

RoundedRectangle(cornerRadius: 20)
  .trim(from: start, to: end)
  .stroke(style: .init(lineWidth: 6, lineCap: .round))
  .foregroundStyle(.indigo)
  .frame(width: 200, height: 200)

Button("Start") {
  withAnimation(.linear(duration: 2).repeatForever(autoreverses: false)) {
    start = 0.75
    end = 1
  }
}

但是这么做有个问题就是线段没办法横跨在0这个起始点的左右两侧,于是就会变成下面这样,在一个周期结束的时候会有个跳变
Sep-28-2024 20-19-01.gif
要解决这个问题,可以当线段横跨这个临界点时,变成两部分,比如一段是从0.9到1,还有一段是0到0.15, 所以可以通过两条线段来实现最终的效果,具体会分两种情况:

  • 线段横跨临界点:通过组合两条线段来形成最终的线段
  • 线段没有横跨临界点:只需要展示一条线段

final class TrimDataContext: ObservableObject {
    @Published var start1: CGFloat = 0
    @Published var end1: CGFloat = 0
    @Published var start2: CGFloat = 0
    @Published var end2: CGFloat = 0
    
    private let totalLength = 0.25
    
    func updateProgress(_ progress: CGFloat) {
        if progress + totalLength <= 1 {
            start1 = progress
            end1 = progress + totalLength
            
            start2 = 0
            end2 = 0
        } else {
            let part2Length = progress + totalLength - 1
            let part1Length = totalLength - part2Length
            
            start1 = 1 - part1Length
            end1 = 1
            
            start2 = 0
            end2 = part2Length
        }
    }
}

上面的progress是指边框流动的进度,所以接下来重点就是看怎么可以逐步去修改这个progress。这里有两种方式:

  1. 通过实现Animatable让progress变成可以被系统动画插值计算的
  2. 通过TimelineView自己计算progress
    最终的效果都类似下图(两条线段使用了不同的颜色,方便查看最终整个线段横跨起点两侧时的情况):
    Oct-07-2024 21-51-32.gif

详细的代码可以查看这里

总结

dashPhase, mask, trim是在研究边框动画时整理的三种不同的实现方式,希望对大家有所帮助。

SwiftUI:让你的边框动起来(一)——dashPhase
SwiftUI:让你的边框动起来(二)——mask

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=21100,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?