SwiftUI .rotation3dEffect 动画在 Apple Watch 列表行中没有所需的深度效果

Posted

技术标签:

【中文标题】SwiftUI .rotation3dEffect 动画在 Apple Watch 列表行中没有所需的深度效果【英文标题】:SwiftUI .rotation3dEffect animation doesn't have desired depth effect in Apple Watch List Row 【发布时间】:2022-01-22 09:24:30 【问题描述】:

当 .rotation3dEffect 在 Apple Watch listRow 中设置动画时,该行似乎在前一行上方进行动画处理(这是理想的),但动画似乎发生在下一行下方,这破坏了 3d 效果。这个动画怎么也出现在下一行的上方?

import SwiftUI

struct TestView: View 
let colors: [Color] = [.red,.blue,.green,.pink,.purple,.black,.brown,.cyan,.indigo,.teal]

var body: some View 
    List 
        ForEach(0..<10)  i in
            RowView(color: colors[i])
        
    
    .listStyle(.carousel)



struct RowView: View 
let color: Color

@State private var rotationAngle: Double = 0

var body: some View 
    Button(action: 
        withAnimation(.easeInOut(duration: 3.0)) 
            rotationAngle += 180
        
    ) 
        HStack 
            Text("Test Row")
            Spacer()
        
        .frame(height: 100)
        .background(color)
        .rotation3DEffect(
            Angle.degrees(rotationAngle),
            axis: (0,1,0),
            perspective: 1.0
    )
    


【问题讨论】:

【参考方案1】:

这是您的perspective 设置。为了模拟透视,Apple 让它看起来像是一个视图在另一个视图后面。这给人一种距离的错觉。离 0 越远,一个视图出现在另一个后面的越多。如果您将perspective 设置为0,您是说我在此视图上自上而下查看,因此它不会位于另一个视图后面。如果你想要一些视角,你需要在你的不同视图之间有一些间隙,所以当你触发动画时不会发生重叠。

struct RowView: View 
    let color: Color
    
    @State private var rotationAngle: Double = 0
    
    var body: some View 
        Button(action: 
            withAnimation(.easeInOut(duration: 3.0)) 
                rotationAngle += 180
            
        ) 
            HStack 
                Text("Test Row")
                Spacer()
            
            .frame(height: 100)
            .background(color)
            .rotation3DEffect(
                Angle.degrees(rotationAngle),
                axis: (0,1,0),
                // Set the perspective to 0 and it animates
                // without being under another view.
                perspective: 0)
        
    

【讨论】:

以上是关于SwiftUI .rotation3dEffect 动画在 Apple Watch 列表行中没有所需的深度效果的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 动画并不总是运行

SwiftUI - SwiftUI 中是不是有等效的 popViewController?

swiftui 请求 渲染数据

SwiftUI 学习曲线

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

SwiftUI - 如何在 SwiftUI 中弹出到特定视图?