Skip Fuse is now free for indie developers!
skip.tools logo

Image

Skip support for SwiftUI.Image on Android. Consult the SkipUI module for a complete list of supported SwiftUI.

The following example screens and source code is from SkipUI’s Showcase sample app ImagePlayground.swift

Android screenshot for Image component (light mode) iPhone screenshot for Image component (light mode) iPhone screenshot for Image component (dark mode) Android screenshot for Image component (dark mode)
import Foundation
import SwiftUI
struct ImagePlayground: View {
 let systemNameSample = "heart.fill"
 let remoteImageResourceURL: URL? = URL(string: "https://picsum.photos/id/237/200/300")
 // iOS: file://.../Application/.../Showcase.app/skipapp-showcase_Showcase.bundle/skip-logo.png
 // Android: asset:/showcase/module/Resources/skip-logo.png
 let localImageResourceURL: URL? = Bundle.module.url(forResource: "skip-logo", withExtension: "png")
 var body: some View {
 ScrollView {
 VStack(spacing: 16.0) {
 Text("Bundled Image").font(.title).bold()
 HStack {
 Spacer()
 AsyncImage(url: localImageResourceURL)
 .border(.blue)
 Spacer()
 }
 Text("systemName").font(.title).bold()
 HStack {
 Text(".frame(100, 100)")
 Spacer()
 Image(systemName: systemNameSample)
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable\n.frame(100, 100)")
 Spacer()
 Image(systemName: systemNameSample)
 .resizable()
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.scaleToFill\n.frame(100, 100)\n.clipped")
 Spacer()
 Image(systemName: systemNameSample)
 .resizable()
 .scaledToFill()
 .frame(width: 100.0, height: 100.0)
 .clipped()
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.scaleToFit\n.frame(100, 100)")
 Spacer()
 Image(systemName: systemNameSample)
 .resizable()
 .scaledToFit()
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.aspectRatio(0.33, .fill)\n.frame(100, 100)\n.clipped")
 Spacer()
 Image(systemName: systemNameSample)
 .resizable()
 .aspectRatio(0.33, contentMode: .fill)
 .frame(width: 100.0, height: 100.0)
 .clipped()
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.aspectRatio(0.33, .fit)\n.frame(100, 100)")
 Spacer()
 Image(systemName: systemNameSample)
 .resizable()
 .aspectRatio(0.33, contentMode: .fit)
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.aspectRatio(3, .fit)\n.frame(100, 100)\n.foregroundStyle(.red)")
 Spacer()
 Image(systemName: systemNameSample)
 .resizable()
 .aspectRatio(3.0, contentMode: .fit)
 .frame(width: 100.0, height: 100.0)
 .foregroundStyle(.red)
 .border(Color.blue)
 }
 Text("AsyncImage").font(.title).bold()
 HStack {
 Spacer()
 AsyncImage(url: remoteImageResourceURL)
 .border(Color.blue)
 }
 HStack {
 Text("scale: 2.0")
 Spacer()
 AsyncImage(url: remoteImageResourceURL, scale: 2.0)
 .border(Color.blue)
 }
 HStack {
 Text(".frame(100, 100)")
 Spacer()
 AsyncImage(url: remoteImageResourceURL)
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".frame(100, 100)\nclipped")
 Spacer()
 AsyncImage(url: remoteImageResourceURL)
 .frame(width: 100.0, height: 100.0)
 .clipped()
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.frame(100, 100)")
 Spacer()
 AsyncImage(url: remoteImageResourceURL) { image in
 image.resizable()
 } placeholder: {
 }
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.scaleToFill\n.frame(100, 100)\n.clipped")
 Spacer()
 AsyncImage(url: remoteImageResourceURL) { image in
 image.resizable()
 } placeholder: {
 }
 .scaledToFill()
 .frame(width: 100.0, height: 100.0)
 .clipped()
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.scaleToFit\n.frame(100, 100)")
 Spacer()
 AsyncImage(url: remoteImageResourceURL) { image in
 image.resizable()
 } placeholder: {
 }
 .scaledToFit()
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.aspectRatio(0.33, .fill)\n.frame(100, 100)\n.clipped")
 Spacer()
 AsyncImage(url: remoteImageResourceURL) { image in
 image.resizable()
 } placeholder: {
 }
 .aspectRatio(0.33, contentMode: .fill)
 .frame(width: 100.0, height: 100.0)
 .clipped()
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.aspectRatio(0.33, .fit)\n.frame(100, 100)")
 Spacer()
 AsyncImage(url: remoteImageResourceURL) { image in
 image.resizable()
 } placeholder: {
 }
 .aspectRatio(0.33, contentMode: .fit)
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text(".resizable()\n.aspectRatio(3, .fit)\n.frame(100, 100)")
 Spacer()
 AsyncImage(url: remoteImageResourceURL) { image in
 image.resizable()
 } placeholder: {
 }
 .aspectRatio(3.0, contentMode: .fit)
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text("No URL")
 Spacer()
 AsyncImage(url: nil)
 .border(Color.blue)
 }
 HStack {
 Text("No URL\n.frame(100, 100)")
 Spacer()
 AsyncImage(url: nil)
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text("Custom placeholder")
 Spacer()
 AsyncImage(url: nil) { image in
 EmptyView()
 } placeholder: {
 ProgressView()
 }
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 HStack {
 Text("Custom closure")
 Spacer()
 AsyncImage(url: nil) { phase in
 switch phase {
 case .empty:
 ProgressView()
 case .failure:
 Color.red
 case .success:
 EmptyView()
 @unknown default:
 EmptyView()
 }
 }
 .frame(width: 100.0, height: 100.0)
 .border(Color.blue)
 }
 }
 .padding()
 }
 .toolbar {
 PlaygroundSourceLink(file: "ImagePlayground.swift")
 }
 }
}

AltStyle によって変換されたページ (->オリジナル) /