站点图标 Codeun

SwiftUI 中 Image 使用方式详解

SwiftUI 中的 Image 是一个用于显示图像的视图组件。可以从不同的来源加载图像,如 SF Symbols 系统符号、本地资源Bundle、网络图片 URL 或者直接从 UIImageNSImage 对象中加载展示图片。

初始化示例

// 从 SF Symbols 系统符号 加载
Image(systemName: "star")
// 从本地资源 Bundle 加载
Image("imageName")
// 从 UIImage 或 NSImage 加载
Image(uiImage: UIImage(named: "imageName")!)
// 从网络加载图片 URL , RemoteImage 的实现在下方
RemoteImage(url: URL(string: "https://www.codeun.com/image.png")!)

加载网络图片示例

import SwiftUI
import Combine
import Foundation

struct RemoteImage: View {
    @StateObject private var imageLoader = ImageLoader()

    let url: URL

    var body: some View {
        Group {
            if let image = imageLoader.image {
                Image(uiImage: image)
                    .resizable()
            } else {
                ProgressView()
            }
        }
        .onAppear {
            imageLoader.load(url: url)
        }
    }
}

class ImageLoader: ObservableObject {
    @Published var image: UIImage?

    private var cancellable: AnyCancellable?

    func load(url: URL) {
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map { UIImage(data: $0.data) }
            .receive(on: DispatchQueue.main)
            .sink(receiveCompletion: { _ in }, receiveValue: { [weak self] image in
                self?.image = image
            })
    }
}

常用的Image Api

Image("imageName")
    .resizable()
    .scaledToFit() // 或者使用 .scaledToFill()
    .aspectRatio(contentMode: .fit)  // .fit or .fill
    .frame(width: 100, height: 100)
    .cornerRadius(20)
    .clipShape(Circle())
    .clipped()
    .opacity(0.5) // 0.0 为完全透明,1.0 为完全不透明
    .overlay(Text("Codeun")) // 在图像上添加文本叠加层

Image(systemName: "star")
    .renderingMode(.template) // 或者使用 .original
    .border(Color.red, width: 5) // 边框颜色和宽度
    .shadow(color: .black, radius: 10, x: 0, y: 5) // 阴影颜色、半径、偏移量
    .background(Color.blue) // 添加蓝色背景

退出移动版