Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 使用 GeometryReader 创建复杂动画

使用 GeometryReader 创建复杂动画

GeometryReader 是 SwiftUI 中的一个强大工具,可以用于获取视图的几何信息并根据这些信息创建复杂的动画效果。通过 GeometryReader,你可以精确控制视图的布局和动画。以下是关于如何使用 GeometryReader 创建复杂动画的介绍和示例。

1. GeometryReader 的基本用法

GeometryReader 可以在视图层次结构中获取父视图的大小和位置。这使得我们能够基于这些信息进行动态布局和动画。

示例:基本 GeometryReader 使用

import SwiftUI

struct BasicGeometryReaderExample: View {
    var body: some View {
        GeometryReader { geometry in
            Text("Width: \(geometry.size.width), Height: \(geometry.size.height)")
                .font(.largeTitle)
                .frame(width: geometry.size.width, height: geometry.size.height, alignment: .center)
                .background(Color.blue)
        }
        .padding()
        .frame(height: 200) // 设置 GeometryReader 的高度
    }
}

2. 动态布局和动画

可以结合 GeometryReader 和动画来创建动态的效果,响应视图大小的变化。

示例:动态位置动画

struct DynamicPositionAnimationExample: View {
    @State private var offset: CGSize = .zero

    var body: some View {
        GeometryReader { geometry in
            Circle()
                .fill(Color.red)
                .frame(width: 100, height: 100)
                .offset(x: offset.width, y: offset.height)
                .gesture(
                    DragGesture()
                        .onChanged { gesture in
                            let xOffset = gesture.translation.width
                            let yOffset = gesture.translation.height

                            // 确保圆形在边界内移动
                            let newOffset = CGSize(
                                width: min(max(xOffset, 0), geometry.size.width - 100),
                                height: min(max(yOffset, 0), geometry.size.height - 100)
                            )
                            offset = newOffset
                        }
                        .onEnded { _ in
                            withAnimation {
                                offset = .zero // 拖动结束时返回原位
                            }
                        }
                )
                .animation(.spring())
        }
        .padding()
        .frame(height: 300) // 设置 GeometryReader 的高度
    }
}

3. 基于几何信息的复杂动画

你可以根据 GeometryReader 中的几何信息来创建更复杂的动画效果,例如变化的大小、颜色和位置。

示例:基于几何信息的动画

struct GeometryBasedAnimationExample: View {
    @State private var isAnimated = false

    var body: some View {
        GeometryReader { geometry in
            VStack {
                Button("Animate") {
                    withAnimation(.easeInOut(duration: 1)) {
                        isAnimated.toggle() // 切换状态
                    }
                }
                .font(.title)
                .padding()

                Rectangle()
                    .fill(isAnimated ? Color.green : Color.blue)
                    .frame(width: isAnimated ? geometry.size.width : geometry.size.width / 2,
                           height: isAnimated ? geometry.size.height / 2 : geometry.size.height)
                    .cornerRadius(20)
                    .animation(.easeInOut) // 设置动画效果
            }
            .padding()
        }
        .frame(height: 400) // 设置 GeometryReader 的高度
    }
}

4. 自定义复杂动画

通过组合不同的动画效果和 GeometryReader,可以创建非常独特和复杂的动画。

示例:自定义复杂动画

struct CustomComplexAnimationExample: View {
    @State private var rotation: Double = 0

    var body: some View {
        GeometryReader { geometry in
            VStack {
                Button("Rotate") {
                    withAnimation(.linear(duration: 2)) {
                        rotation += 360 // 增加旋转角度
                    }
                }
                .font(.title)
                .padding()

                Rectangle()
                    .fill(Color.purple)
                    .frame(width: 100, height: 100)
                    .rotationEffect(.degrees(rotation)) // 根据状态调整旋转
                    .position(x: geometry.size.width / 2, y: geometry.size.height / 2) // 使用 GeometryReader 定位
            }
        }
        .frame(height: 400) // 设置 GeometryReader 的高度
    }
}

5. 总结

  • GeometryReader:获取视图的几何信息,支持动态布局和响应式动画。
  • 动态布局和动画:结合手势和几何信息,创建响应用户交互的动画。
  • 复杂动画:根据几何信息控制多个属性的变化,创建丰富的动画效果。

使用 GeometryReader 可以大大增强你的 SwiftUI 应用的动画表现力,让你实现更复杂和动态的用户界面效果。

Last Updated:: 11/3/24, 10:41 PM