MST
星途 面试题库

面试题:Swift中SwiftUI视图动画过渡之复杂交互

假设你有一个包含多个子视图的SwiftUI视图,要求实现这样一个功能:当用户长按其中一个子视图时,该子视图以缩放和旋转的组合动画进行展示,同时其他子视图以淡入淡出的动画效果隐藏。请详细说明实现思路并给出关键代码片段。
11.1万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 为每个子视图添加长按手势识别。
  2. 当长按某个子视图时,通过状态变量标记该子视图为被选中状态。
  3. 根据状态变量,对被选中的子视图应用缩放和旋转的组合动画。
  4. 同样根据状态变量,对其他未被选中的子视图应用淡入淡出的动画效果。

关键代码片段

import SwiftUI

struct ContentView: View {
    @State private var selectedIndex: Int? = nil
    let subViews = ["A", "B", "C", "D"]

    var body: some View {
        VStack {
            ForEach(0..<subViews.count, id: \.self) { index in
                Text(subViews[index])
                    .font(.largeTitle)
                    .scaleEffect(selectedIndex == index ? 2 : 1)
                    .rotationEffect(.degrees(selectedIndex == index ? 360 : 0))
                    .opacity(selectedIndex == index ? 1 : 0)
                    .animation(.easeInOut(duration: 0.5), value: selectedIndex)
                    .onLongPressGesture {
                        selectedIndex = index
                    }
            }
        }
    }
}

在上述代码中:

  • @State private var selectedIndex: Int? = nil 用于标记被选中子视图的索引。
  • ForEach 循环创建多个子视图,根据 selectedIndex 来决定每个子视图的缩放、旋转和透明度。
  • .onLongPressGesture 为每个子视图添加长按手势,当长按发生时,更新 selectedIndex
  • .animation 应用动画效果,使得变化过程更平滑。