SwiftUI基础 - Image 图片

57 篇文章 1 订阅

Image 图片

SwiftUI中, 使用 Image 渲染图片, Image 可以加载 资源包, 系统图标, UIImage 等图片资源.

基本用法

1.从资源包内加载图片

Image("cat")

2.加载UIImage图片

Image(uiImage: UIImage(named: "dog")!)

3.加载苹果的 SF Symbols Icon

Image(systemName: "cloud.heavyrain.fill")
    .font(.largeTitle)

属性设置

内容显示设置

Image("rome")
    .resizable() // 内容延伸
    .aspectRatio(contentMode: .fit) // 缩放比例
    .frame(width: 250) // 设置宽高

图像平铺

// 完全平铺
Image("logo")
    .resizable(resizingMode: .tile)

// 带边距平铺
Image("logo")
    .resizable(capInsets: EdgeInsets(top: 20, leading: 20, bottom: 20, trailing: 20), resizingMode: .tile)

渲染 SF Symbols

Image(systemName: "cloud.sun.rain.fill")
    .renderingMode(.original) // 渲染模式
    .font(.largeTitle) // 显示大小
    .padding() // 边距
    .background(Color.black) // 背景色
    .clipShape(Circle()) // 边缘效果

加载网络图片

SwiftUI有一个专门的AsyncImage,用于从互联网下载和显示远程图像。
其最简单的形式中,你可以只传递一个URL,像这样:

AsyncImage(url: URL(string: "https://img1.doubanio.com/view/photo/l/public/p2292035027.jpg"))

URL 为空时或者无效时, AsyncImage 回显示默认灰色占位背景图

AsyncImage 在加载图片时, 不知道图片大小, 所以加载时会占满整个视图. 当图片加载完成后, 渲染成正确的大小. 我们可以设置图像的大小和显示方式,以及使用占位符颜色来避免加载前后大小不一致问题.

AsyncImage(url: URL(string: "https://img1.doubanio.com/view/photo/l/public/p2292035027.jpg")) { image in
    image.resizable() // 填充
} placeholder: {
    Color.red // 占位背景色
}
.frame(width: 128, height: 128) // 大小
.clipShape(RoundedRectangle(cornerRadius: 25)) // 圆角

因为生成的图像和占位符颜色现在都可以调整大小,所以frame()修改器能够确保我们AsyncImage始终保持正确的大小。

如果我们知道图像的比例, 可以通过scale参数来加载图像:

AsyncImage(url: URL(string: "https://img1.doubanio.com/view/photo/l/public/p2292035027@2x.png"), scale: 2)
SwiftUI是一种新的UI框架,其中包含了Image视图,使开发者可以方便地加载本地或网络图片。在SwiftUI中,加载网络图片可以使用异步加载程序来避免UI线程的阻塞。 首先,需要创建一个异步加载程序来加载网络图片。可以使用URLSession模块并执行网络请求从URL中加载图片。在URL请求返回后,异步程序可以使用Data类型来保存图片数据,然后将其转换为UIImage或CGImage以便于在SwiftUI视图中显示。 为了在SwiftUI中显示网络图片,需要在Image视图中使用URL实例作为图片的来源。当SwiftUI视图构建时,Image会使用异步程序中保存的图片数据来显示网络图片。 以下是使用SwiftUI加载网络图片的示例代码: ``` struct NetworkImage: View { @ObservedObject var imageDownloader: ImageDownloader init(url: URL) { imageDownloader = ImageDownloader(url: url) } var body: some View { Image(uiImage: UIImage(data: imageDownloader.data) ?? UIImage()) .resizable() .aspectRatio(contentMode: .fit) } } class ImageDownloader: ObservableObject { @Published var data = Data() init(url: URL) { URLSession.shared.dataTask(with: url) { (data, _, _) in guard let data = data else { return } DispatchQueue.main.async { self.data = data } }.resume() } } ``` 在上面的代码中,创建了一个名为NetworkImage的视图。该视图包含了一个名为imageDownloader的异步下载程序,用于加载网络图片。在init方法中,imageDownloader使用URL实例来执行异步任务进行图片下载。在异步任务的返回处理中保存数据以更新图片数据。该视图使用Image视图并将UIImage实例转换为Image使用。Image视图的resizable和aspectRatio方法用于设置图片的尺寸和比例。 最后,要注意异步任务可以在SwiftUI视图销毁后继续运行,因此需要确保在异步任务中对视图进行弱引用,避免造成内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值