简体   繁体   English

在SwiftUI的自定义视图中访问Image的修饰符

[英]Accessing modifiers of Image in custom View in SwiftUI

Currently, i have made a custom view in SwiftUI containing an Image with some details. 目前,我已经在SwiftUI中创建了一个自定义视图,其中包含带有一些详细信息的Image。 How can we add specific image modifiers outside my view instance? 我们如何在视图实例之外添加特定的图像修改器?

import Foundation
import SwiftUI
import Combine

struct RemoteImage: View {

    // Hold reference to our remote resource through binding
    @ObjectBinding
    private var resource: RemoteResource

    // Initialize the Image with a string
    init(urlString: String) {

        // Create our resource and request our data
        // Will fetch the resource from the internet
        self.resource = RemoteResource(urlString)
    }

    // Computed var that will return a placeholder image our our actual resource
    private var image: UIImage {
        self.resource.data.flatMap(UIImage.init) ?? UIImage(named: "placeholder")!
    }

    var body: some View {
        Image(uiImage: image)
    }
}

How would i add modifiers from an instance of RemoteImage to Image 我将如何从RemoteImage实例向Image添加修饰符

RemoteImage(urlString: "image-url-here")
    .resizable()
    .scaledToFit()

If anyone would know a solution to my problem please let me know. 如果有人可以解决我的问题,请告诉我。

If you declare your RemoteImage like this: 如果您这样声明RemoteImage:

import Foundation
import SwiftUI
import Combine

struct RemoteImage: View {

    // Hold reference to our remote resource through binding
    @ObservedObject
    private var resource: RemoteResource

    // Initialize the Image with a string
    init(urlString: String) {

        // Create our resource and request our data
        // Will fetch the resource from the internet
        self.resource = RemoteResource(urlString)
    }

    // Computed var that will return a placeholder image our our actual resource
    private var image: UIImage {
        self.resource.data.flatMap(UIImage.init) ?? UIImage(named: "placeholder")!
    }

    var body: Image {
        Image(uiImage: image)
    }
}

then you can call all Image specific modifiers like this: 那么您可以像这样调用所有特定于图像的修饰符:

RemoteImage(urlString: "image-url-here").body
    .resizable()
    .scaledToFit()

Not ideal, but at least you don't have to redeclare every single modifier manually. 这并不理想,但是至少您不必手动重新声明每个修饰符。

The code below adds two properties, you will be able to call 下面的代码添加了两个属性,您将可以调用

RemoteImage(urlString: myLink).resizable().renderingMode(myRenderingMode)

You can add any amount you need. 您可以添加所需的任何数量。

struct RemoteImage: View {   
    // Hold reference to our remote resource through binding
    @ObjectBinding
    private var resource: RemoteResource

    // Initialize the Image with a string
    init(urlString: String) {

        // Create our resource and request our data
        // Will fetch the resource from the internet
        self.resource = RemoteResource(urlString)
    }

    // Computed var that will return a placeholder image our our actual resource
    private var image: UIImage {
        self.resource.data.flatMap(UIImage.init) ?? UIImage(named: "placeholder")!
    }

    // Put whatever new properties you want here *****************
    private var _resizable: (capInsets: EdgeInsets, resizingMode: Image.ResizingMode) = (EdgeInsets(), .stretch)
    private var _renderingMode: Image.TemplateRenderingMode? = nil
    // *****************

    var body: some View {
        Image(uiImage: image)
           .resizable(capInsets: _resizable.capInsets, resizingMode: _resizable.resizingMode)
           .renderingMode(_renderingMode)
    }

    // Put whatever new functions you want here *****************
    func resizable(capInsets: EdgeInsets = EdgeInsets(), resizingMode: Image.ResizingMode = .stretch) -> RemoteImageComponent {
        var rm = self
        rm._resizable = (capInsets, resizingMode)
        return rm
    }

    func renderingMode(_ renderingMode: Image.TemplateRenderingMode?) -> RemoteImageComponent {
        var rm = self
        rm._renderingMode = renderingMode
        return rm
    }
}

If you need to know what parameters to add to you new properties, then simple click on CMD click on the system function to see what is needed. 如果您需要知道要添加到新属性的参数,则只需单击CMD,然后单击系统功能即可查看所需的内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM