【问题标题】:Is there an opposite to .onAppear modifier in SwfitUI?SwiftUI 中是否有与 .onAppear 修饰符相反的东西?
【发布时间】:2020-05-15 15:16:38
【问题描述】:

我创建了一个自定义水平滚动,它使用动画来滚动。 当视图呈现时,它使用动画来呈现视图。

因此,当我调用视图并启动 onAppear 时,它会通过动画更改偏移量,但这种行为是不需要的。我不想在创建视图时为其设置动画。

我尝试创建@State 变量

    @State private var myBool = false

并创建一个条件:

     .animation(self.myBool ? Animation.spring : .none)

然后在.onAppear里面

     .onAppear(
         ...
            some code that changing state variables
         ...
         self.myBool = true
     )

但它没有工作,即使 myBool 为 false 时它仍然使用动画

如何仅在创建主体后才允许动画? 我的意思是,有修饰符 .onFinish 吗?

这是代码示例:

   struct scroll: View {
       @State var offset: 0

       var body: some View {
          GeometryReader { geo in
              HStack {

                   ForEach(0..<5) { i in
                       Rectangle()
                   }

               }
                .gesture(DragGesture()
                 .onChange ({ (value) in
                     self.offset = value.translation.width
                 }
                 .onEnded ({ _ in
                     self.offset = 50

                 }


            )
            .offset(x: self.offset)
            .animation(.spring)
            .onAppear (
                self.offset = geo.size.width
            )
            }
       }
   }

【问题讨论】:

  • 我不确定我是否理解问题所在。您能否提供一些工作演示代码或屏幕录像来删除不需要的效果?
  • 我编辑了代码示例我在应用 onChange 和 onEnded 时得到了动画 而且 onAppear 也使用动画,因为它改变了偏移量我的问题是我不想在 onAppear 中使用动画

标签: swiftui


【解决方案1】:

我现在看到你只需要直接设置初始值

struct scroll: View {
    var body: some View {
        GeometryReader { geo in
            innerScroll(offset: geo.size.width) // << here !!
        }
    }

    struct innerScroll: View {        // inner subview
        @State var offset: CGFloat

        var body: some View {
            HStack {
                ForEach(0..<5) { i in
                    Rectangle()
                }
            }
            .gesture(DragGesture()
            .onChanged { (value) in
                self.offset = value.translation.width
            }
            .onEnded { _ in
                self.offset = 50

                }
            )
                .offset(x: self.offset)
                .animation(.spring())
        }
    }
}

【讨论】:

  • 是的,这是一个很好的解决方案,但我正在使用几何阅读器。我无法修改几何阅读器之外的偏移量,所以我需要使用 onAppear 我将更新示例代码
  • @Kevin,无论如何最好通过初始化来做,只是有点不同 - 请参阅更新。
【解决方案2】:

也许我误解了你的问题,但如果你不想要任何动画onAppear,你为什么不用150初始化你的偏移量? 相反,您从 0 开始并将其设置为 150 onAppear,这似乎是动画的原因,因为变量在 onAppear 上发生了变化。

【讨论】:

  • 是的,这是一个很好的解决方案,但我正在使用几何阅读器。我无法修改几何阅读器之外的偏移量,所以我需要使用 onAppear 我将更新示例代码
猜你喜欢
  • 2022-11-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多