SwiftUI — Image

🔹 SwiftUI Image 组件的使用方法 #

SwiftUI 的 Image 组件用于显示图片,支持本地图片、SF Symbols、远程加载等多种方式。


1️⃣ Image 的基本使用 #

✅ 1. 加载 Assets.xcassets 里的图片 #

Image("example_image") // 直接从 asset 里加载

✅ 2. 加载 SF Symbols(系统图标) #

Image(systemName: "star.fill") // 使用 SF Symbols
    .resizable()
    .scaledToFit()
    .frame(width: 50, height: 50)
    .foregroundColor(.yellow)

📌 SF Symbols 仅支持 iOS 13+,可以调整大小和颜色。


✅ 3. 从 Bundle 加载图片 #

Image("example_image", bundle: .main) // 从主 Bundle 加载

📌 适用于

  • 自定义 Bundle 资源(如 Package.swift 里的 Bundle.module

✅ 4. 直接从 UIImageNSImage 加载 #

Image(uiImage: UIImage(named: "example_image")!) // iOS/macOS

📌 适用于

  • UIImagePickerController 选择的图片
  • 动态加载的 UIImage

✅ 5. 远程加载图片(AsyncImage) #

AsyncImage(url: URL(string: "https://example.com/image.jpg")) { phase in
    if let image = phase.image {
        image.resizable().scaledToFit() // 成功加载
    } else if phase.error != nil {
        Text("Failed to load") // 加载失败
    } else {
        ProgressView() // 正在加载
    }
}
.frame(width: 100, height: 100)

📌 AsyncImage 适用于 iOS 15+,用于远程图片加载


2️⃣ Image 的修饰符 #

SwiftUI 提供了多种修饰符来调整 Image,以下是常用的修饰符表:

修饰符作用示例
.resizable()让图片支持缩放Image("example").resizable()
.scaledToFit()等比例缩放至完整显示Image("example").resizable().scaledToFit()
.scaledToFill()等比例缩放至填充Image("example").resizable().scaledToFill()
.frame(width:, height:)设置固定大小.frame(width: 100, height: 100)
.aspectRatio(contentMode:)设置缩放模式.aspectRatio(contentMode: .fit)
.clipShape(shape)裁剪形状.clipShape(Circle())
.cornerRadius(radius)圆角.cornerRadius(10)
.overlay(View, alignment:)添加叠加视图.overlay(Text("Overlay"), alignment: .bottom)
.shadow(radius:)阴影.shadow(radius: 10)
.opacity(value)透明度.opacity(0.5)
.foregroundColor(Color)设置 SF Symbols 颜色Image(systemName: "heart.fill").foregroundColor(.red)
.blendMode(.mode)颜色混合模式.blendMode(.multiply)
.brightness(value)亮度调整.brightness(0.2)
.contrast(value)对比度调整.contrast(1.5)
.grayscale(value)灰度效果.grayscale(0.5)
.hueRotation(Angle)颜色旋转.hueRotation(.degrees(45))
.blur(radius:)模糊效果.blur(radius: 5)
.rotationEffect(Angle)旋转角度.rotationEffect(.degrees(45))
.animation(Animation?)添加动画.animation(.easeInOut)

3️⃣ 代码示例 #

✅ 图片加圆角、阴影、模糊 #

Image("example")
    .resizable()
    .scaledToFit()
    .frame(width: 150, height: 150)
    .clipShape(RoundedRectangle(cornerRadius: 20))
    .shadow(radius: 10)
    .blur(radius: 1)

✅ 在 ZStack 中添加 overlay 文字 #

ZStack {
    Image("background")
        .resizable()
        .scaledToFill()
        .frame(width: 300, height: 200)
        .clipped()
    
    Text("Hello, World!")
        .font(.largeTitle)
        .bold()
        .foregroundColor(.white)
        .shadow(radius: 5)
}

✅ SF Symbols 自定义颜色 #

Image(systemName: "star.fill")
    .resizable()
    .scaledToFit()
    .frame(width: 50, height: 50)
    .foregroundColor(.yellow) // SF Symbols 颜色

✅ 结合 gesture 增加交互 #

struct ContentView: View {
    @State private var scale: CGFloat = 1.0
    
    var body: some View {
        Image("example")
            .resizable()
            .scaledToFit()
            .frame(width: 200, height: 200)
            .scaleEffect(scale)
            .gesture(
                MagnificationGesture()
                    .onChanged { value in
                        scale = value
                    }
            )
    }
}

📌 使用 MagnificationGesture 可以让用户用手势放大缩小图片。


🔹 总结 #

  1. Image 支持本地 AssetsSF SymbolsUIImageAsyncImage 远程加载等方式。
  2. Image 需要 .resizable() 才能调整大小,否则默认是原始大小。
  3. SwiftUI 提供了丰富的修饰符,可以控制 frame颜色滤镜动画叠加手势 等效果。
  4. 最佳实践
    • 普通图片Image("name").resizable().scaledToFit()
    • SF SymbolsImage(systemName: "star.fill").foregroundColor(.yellow)
    • 圆形头像.clipShape(Circle()).overlay(Circle().stroke(Color.white, lineWidth: 2))
    • 带阴影+模糊.shadow(radius: 10).blur(radius: 2)
本文共 928 字,创建于 Feb 13, 2025
相关标签: SwiftUI, Xcode