如何使用 SwiftUI 制作自定义 Image resizable()

iOS*_*com 5 ios swift swiftui

我有意见

struct CustomImageView : View {
    var body: some View {
        Image("someImage")
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在外面引用这个视图时,我无法调整图像大小。我知道我可以传递参数,但我正在寻找一种更简洁的方法来通过修饰符来做到这一点?

VStack {
   CustomImageView()
      .resizable()    // This does not work
}
Run Code Online (Sandbox Code Playgroud)

resizable 似乎只能直接处理图像。有谁知道如何使 CustomImageView 可调整大小?

更新:我知道我可以使用参数,但是无论如何可以使用修饰符来做到这一点?Resizable 只是一种属性,但还有其他属性。并将它们全部列为单个变量将太多

基于@matteo-pacini 实现的答案 它使用 AlamofireImage 在 ImageView 中加载远程图像。

struct RemoteImage : View {
    var url: URLConvertible
    @ObjectBinding var imageLoader = AlamofireImageLoader()

    private (set) var _resizable: (capInsets: EdgeInsets, resizingMode: Image.ResizingMode) = (EdgeInsets(), .stretch)

    var body: some View {
        Image(uiImage: imageLoader.image)
            .resizable(capInsets: _resizable.capInsets, resizingMode: _resizable.resizingMode)
            .onAppear() {
                self.imageLoader.loadImage(url: self.url)
            }
    }

    func resizable(capInsets: EdgeInsets = EdgeInsets(), resizingMode: Image.ResizingMode = .stretch) -> RemoteImage {
        return RemoteImage(url: url, _resizable: (capInsets, resizingMode))
    }
}

class AlamofireImageLoader: BindableObject {
    var didChange = PassthroughSubject<Void, Never>()
    var image = UIImage() {
        didSet {
            DispatchQueue.main.async {
                self.didChange.send(Void())
            }
        }
    }

    convenience init(url: URLConvertible) {
        self.init()
        loadImage(url: url)
    }

    func loadImage(url: URLConvertible) {
        Alamofire.request(url).responseImage { response in
            if let image = response.result.value {
                self.image = image
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ini 5

struct CustomImageView : View {

    private var isResizable = false

    var body: some View {
        let image = Image("someImage")
        return isResizable ? image.resizable() : image
    }

    func resizable() -> CustomImageView {
        return CustomImageView(isResizable: true)
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它。


struct ContentView: View {
    var body: some View {
        VStack {
            CustomImageView()
                .resizable()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)