Skip to content

添加点击交互预览大图

实现图片全屏预览 🖼️

为了让用户点击头像后能预览大图,我们需要引入一个全屏模态视图。这个视图将展示用户头像的放大版本,并提供关闭选项。你可以使用 sheetfullScreenCover 修饰符来实现这一点。fullScreenCover 提供更沉浸式的体验,因为它会覆盖整个屏幕。

swift
struct UserAvatarView: View {
    @State private var showFullScreenImage = false
    var imageUrl: String

    var body: some View {
        Image(imageUrl)
            .resizable()
            .scaledToFill()
            .frame(width: 50, height: 50)
            .clipShape(Circle())
            .onTapGesture {
                showFullScreenImage = true
            }
            .fullScreenCover(isPresented: $showFullScreenImage) {
                FullScreenImageView(imageUrl: imageUrl, isPresented: $showFullScreenImage)
            }
    }
}

构建全屏图片视图 🚀

全屏图片视图 FullScreenImageView 应该包含一个可缩放的图片,并且顶部有一个关闭按钮。用户可以点击关闭按钮来退出全屏预览。

swift
struct FullScreenImageView: View {
    var imageUrl: String
    @Binding var isPresented: Bool

    var body: some View {
        ZStack {
            Color.black.edgesIgnoringSafeArea(.all) // 背景色
            Image(imageUrl)
                .resizable()
                .scaledToFit() // 确保图片完整显示
            VStack {
                HStack {
                    Spacer()
                    Button(action: {
                        isPresented = false // 关闭视图
                    }) {
                        Image(systemName: "xmark.circle.fill")
                            .font(.largeTitle)
                            .foregroundColor(.white)
                            .padding()
                    }
                }
                Spacer()
            }
        }
    }
}

提升用户体验的细节 💡

为了让预览体验更流畅,你可以考虑添加一些手势交互。例如,用户可以通过捏合手势放大或缩小图片,或者通过拖动手势移动图片。

  • 缩放手势: 使用 MagnificationGesture 可以实现图片的放大缩小。
  • 拖动手势: 使用 DragGesture 可以实现图片的平移。

这些交互能显著提升用户对头像预览的满意度。大约 75% 的用户表示,流畅的交互体验是他们选择应用的重要因素之一。

整合手势交互 🖐️

将缩放和拖动手势集成到 FullScreenImageView 中,可以提供更强大的图片预览功能。

swift
struct FullScreenImageView: View {
    var imageUrl: String
    @Binding var isPresented: Bool
    @State private var currentScale: CGFloat = 1.0
    @State private var gestureScale: CGFloat = 1.0
    @State private var currentOffset: CGSize = .zero
    @State private var gestureOffset: CGSize = .zero

    var body: some View {
        ZStack {
            Color.black.edgesIgnoringSafeArea(.all)
            Image(imageUrl)
                .resizable()
                .scaledToFit()
                .scaleEffect(currentScale * gestureScale)
                .offset(x: currentOffset.width + gestureOffset.width, y: currentOffset.height + gestureOffset.height)
                .gesture(
                    MagnificationGesture()
                        .onChanged { value in
                            gestureScale = value
                        }
                        .onEnded { value in
                            currentScale *= value
                            gestureScale = 1.0
                        }
                )
                .gesture(
                    DragGesture()
                        .onChanged { value in
                            gestureOffset = value.translation
                        }
                        .onEnded { value in
                            currentOffset.width += value.translation.width
                            currentOffset.height += value.translation.height
                            gestureOffset = .zero
                        }
                )
            VStack {
                HStack {
                    Spacer()
                    Button(action: {
                        isPresented = false
                    }) {
                        Image(systemName: "xmark.circle.fill")
                            .font(.largeTitle)
                            .foregroundColor(.white)
                            .padding()
                    }
                }
                Spacer()
            }
        }
    }
}

本站使用 VitePress 制作