SwiftUI 和 NavigationView 的动画错误可能是什么原因造成的?

2023-12-26

我一直在尝试一些 SwiftUI 布局,我想尝试的事情之一是创建一个简单的圆形进度环。在对代码进行了一段时间的研究之后,我设法让一切都按照我希望的方式工作,至少对于原型来说是这样。当我将此视图嵌入到 SwiftUI NavigationView 中时,问题就出现了。现在,每次我在画布、模拟器或设备上运行应用程序时,进度环的初始加载都会使整个视图缓慢地向上滑动到位。

这是一个简单的原型,只是使用新的 SwiftUI 工具。经过一些实验,我发现如果我删除 NavigationView,环就会像从一开始就应该发挥作用一样。但我没有看到发生此问题的明显原因。

import SwiftUI

struct ProgressRing_ContentView: View {

@State var progressToggle = false
@State var progressRingEndingValue: CGFloat = 0.75

var ringColor: Color = Color.green
var ringWidth: CGFloat = 20
var ringSize: CGFloat = 200

var body: some View {
    TabView{
        NavigationView{
            VStack{

                Spacer()

                ZStack{
                    Circle()
                        .trim(from: 0, to: progressToggle ? progressRingEndingValue : 0)
                        .stroke(ringColor, style: StrokeStyle(lineWidth: ringWidth, lineCap: .round, lineJoin: .round))
                        .background(Circle().stroke(ringColor, lineWidth: ringWidth).opacity(0.2))
                        .frame(width: ringSize, height: ringSize)
                        .rotationEffect(.degrees(-90.0))
                        .animation(.easeInOut(duration: 1))
                        .onAppear() {
                            self.progressToggle.toggle()
                        }

                    Text("\(Int(progressRingEndingValue * 100)) %")
                        .font(.largeTitle)
                        .fontWeight(.bold)
                }

                Spacer()

                Button(action: {
                    self.progressRingEndingValue = CGFloat.random(in: 0...1)
                }) { Text("Randomize")
                        .font(.largeTitle)
                        .foregroundColor(ringColor)
                }

                Spacer()

            }
            .navigationBarTitle("ProgressRing", displayMode: .inline)
            .navigationBarItems(leading:
                Button(action: {
                    print("Refresh Button Tapped")
                    }) {
                    Image(systemName: "arrow.clockwise")
                        .foregroundColor(Color.green)
                    }, trailing:
                Button(action: {
                    print("Share Button Tapped")
                    }) {
                    Image(systemName: "square.and.arrow.up")
                        .foregroundColor(Color.green)
                }
            )
        }
    }
}
}

#if DEBUG
struct ProgressRing_ContentView_Previews: PreviewProvider {
static var previews: some View {
    Group {

        ProgressRing_ContentView()
            .environment(\.colorScheme, .light)
            .previewDisplayName("Light Mode")

}
}
#endif

以上是我当前正在使用的确切代码。环滑动的实际动画似乎按照我的预期工作,我只是不确定为什么整个环本身在嵌入导航视图时会移动。


您需要使用显式动画,而不是隐式动画。使用隐式动画,任何可设置动画的参数发生变化,框架都会生成动画。只要有可能,您就应该使用显式动画。以下是更新后的代码。请注意,我删除了 .animation() 调用并添加了两个 withAnimation() 闭包。

如果您想扩展有关隐式动画与显式动画的知识,请检查此链接:https://swiftui-lab.com/swiftui-animations-part1/ https://swiftui-lab.com/swiftui-animations-part1/

struct ContentView: View {

    @State var progressToggle = false
    @State var progressRingEndingValue: CGFloat = 0.75

    var ringColor: Color = Color.green
    var ringWidth: CGFloat = 20
    var ringSize: CGFloat = 200

    var body: some View {
        TabView{
            NavigationView{
                VStack{

                    Spacer()

                    ZStack{
                        Circle()
                            .trim(from: 0, to: progressToggle ? progressRingEndingValue : 0)
                            .stroke(ringColor, style: StrokeStyle(lineWidth: ringWidth, lineCap: .round, lineJoin: .round))
                            .background(Circle().stroke(ringColor, lineWidth: ringWidth).opacity(0.2))
                            .frame(width: ringSize, height: ringSize)
                            .rotationEffect(.degrees(-90.0))
                            .onAppear() {
                                withAnimation(.easeInOut(duration: 1)) {
                                    self.progressToggle.toggle()
                                }
                        }

                        Text("\(Int(progressRingEndingValue * 100)) %")
                            .font(.largeTitle)
                            .fontWeight(.bold)
                    }

                    Spacer()

                    Button(action: {
                        withAnimation(.easeInOut(duration: 1)) {
                            self.progressRingEndingValue = CGFloat.random(in: 0...1)
                        }
                    }) { Text("Randomize")
                        .font(.largeTitle)
                        .foregroundColor(ringColor)
                    }

                    Spacer()

                }
                .navigationBarTitle("ProgressRing", displayMode: .inline)
                .navigationBarItems(leading:
                    Button(action: {
                        print("Refresh Button Tapped")
                    }) {
                        Image(systemName: "arrow.clockwise")
                            .foregroundColor(Color.green)
                    }, trailing:
                    Button(action: {
                        print("Share Button Tapped")
                    }) {
                        Image(systemName: "square.and.arrow.up")
                            .foregroundColor(Color.green)
                    }
                )
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 和 NavigationView 的动画错误可能是什么原因造成的? 的相关文章

随机推荐

  • 为 ARM 交叉编译 ocaml 应用程序

    我正在交叉编译一个触摸屏驱动程序 它附带一个 ocaml 校准应用程序 我正在尝试编译 ARM 的驱动程序和应用程序 特别是运行 Angstr m 的 Beagleboard 事情是这样的 raziel Bebop zytouch driv
  • 将 jQuery 代码添加到 ASP.NET Boilerplate

    我有一个使用 ASP NET Boilerplate 的项目 我想通过使用 jQuery 添加更多功能 我尝试在页面末尾 例如Home cshtml 写一段简单的代码 如下 看起来完全没有效果 然后我尝试将此代码放入 Home js 文件中
  • SQL 获取 Netezza DB 中的唯一行

    我有一个表 其中的行如下 id group name code 1 999 2 16 3 789 4 999 5 231 6 999 7 349 8 16 9 819 10 999 11 654 但我想要这样的输出行 id group na
  • 如何根据键从对象文字返回值?

    我有一个数组如下 如何检索特定键的值并将该值放入变量中 var obj one 1 two 3 three 5 four 1 five 6 例如 如果我想获取 三 的值 我该如何在 javascript 或 jQuery 中实现呢 您可以通
  • 在 ubuntu 18.04.4LTS 上重新安装 gitlab 后,gitlab-reconfigure 在 redis 上被阻止

    这是我第三次在服务器上安装 gitlab 之前从未遇到过问题 在处理 12 9 0 上的问题后 我决定重新安装 gitlab ce 12 10 0 在安装新版本之前 我已确保删除所有 gitlab 文件并重新启动服务器 步骤1 卸载gitl
  • numpy 中数据类型的奇怪隐式转换

    我创建了一个简单的 numpy 数据类型 uint 如下所示 import numpy as np a np array 1 2 3 dtype np uint 当我计算时 a 0 1 我期望结果为 2 但它给出了 2 0 为什么 np u
  • 如何从通用方法访问类的属性 - C#

    我有一个具有以下属性的三类 Class A public int CustID get set public string Name get set Class B public int CustID get set public stri
  • 强制分配返回的对象[重复]

    这个问题在这里已经有答案了 在 C 中 有没有办法强制对函数的返回值进行赋值 即如果我有一个成员函数 foo class myClass public T1 foo T2 x T1 y something return y 我可以在 mai
  • Android POSIX 兼容吗?

    Android POSIX 兼容吗 我知道它使用 Linux 内核 但我不确定这是否意味着它兼容 POSIX 因为 POSIX 标准更多地处理用户层函数 那么 兼容吗 例如 如果我在 C 程序中仅使用 ANSI 和 POSIX 函数 它是否
  • 如何在 Objective-C 中取消安排 NSTimer

    我在应用程序中使用嵌套 NSTimer 我这里有两个问题 如何在此函数中重新启动计时器 void updateLeftTime NSTimer theTimer 如何杀死之前的计时器 因为 void updateLevel NSTimer
  • faunadb中如何进行多条件查询?

    我尝试提高对 FaunaDB 的理解 我有一个包含以下记录的集合 ref Ref Collection regions 261442015390073344 ts 1587576285055000 data name italy attri
  • Python:从文件夹中读取多个json文件

    我想知道如何阅读几本json来自单个文件夹的文件 不指定文件名 只是它们是 json 文件 此外 还可以将它们变成pandas数据框 你能给我一个基本的例子吗 一种选择是列出目录中的所有文件操作系统列表目录 https docs pytho
  • .dockerignore 无法包含具有 !**/*.extension 模式的子目录中的文件

    我遇到了问题 dockerignore文件 这是我的项目结构 file sh file js file go file py subdir file2 go file2 py dockerignore Dockerfile 根据 docke
  • c# 将DataGridView保存到Xml文件

    这是我保存文件的按钮 private void metroButton12 Click object sender EventArgs e save DataSet ds DataSet dataGridView1 DataSource S
  • 使用 resharper 从大型类创建接口

    我有一个非常大的类 有很多方法 是否可以使用 Resharper 从该类构建接口 Yes 我的快捷键是 Ctrl Shift R 来调出重构选项 对类名执行此操作允许您 提取接口 或者 您可以从菜单 gt ReSharper gt Refa
  • 在哪里放置对象映射(在 RestKIt 中)

    因为我不想劫持另一个线程 所以我提出了关于映射的问题 首先阅读 RestKit 中放置对象映射的最佳位置是哪里 https stackoverflow com questions 7190721 wheres the best place
  • 如何在启用 Markdown 的 Slack 附件行的开头显示大于号?

    我正在尝试匹配 Slack API 消息的模型 该消息在附件文本行开头的链接中具有大于 gt 字符 该模型还在附件文本中使用斜体和粗体 所以我有text in the mrkdown in大批 不幸的是 这会导致 Slack 解释为 gt
  • 访问 RFC 调用系统的堆栈内存

    当程序在 SAP ECC 中运行时 系统堆栈 存储所有全局变量 无论在该单个会话中调用什么模块 程序 当它调用支持 RFC 的功能模块 FM 时 会在被调用系统中创建一个新的系统堆栈 并且当被调用 FM 完成时 只能在 ECC 中检索被调用
  • InvalidCharacterError 仅在 IE 中出现

    我们有一个订单表单 它使用 ziplookup 功能 当在字段中输入邮政编码时 城市 县 州和邮政编码也会输入到同一字段中 tr td class formLabel Zip Code td td class formColon nbsp
  • SwiftUI 和 NavigationView 的动画错误可能是什么原因造成的?

    我一直在尝试一些 SwiftUI 布局 我想尝试的事情之一是创建一个简单的圆形进度环 在对代码进行了一段时间的研究之后 我设法让一切都按照我希望的方式工作 至少对于原型来说是这样 当我将此视图嵌入到 SwiftUI NavigationVi