Как сделать пользовательское изображение изменяемого размера () с SwiftUI - PullRequest
2 голосов
/ 15 июня 2019

У меня есть представление

struct CustomImageView : View {
    var body: some View {
        Image("someImage")
    }
}

Когда я ссылаюсь на этот вид снаружи, я не могу изменить размер изображения. Я знаю, что могу передавать параметры, но я искал более удобный способ сделать это с помощью модификаторов?

VStack {
   CustomImageView()
      .resizable()    // This does not work
}

изменяемый размер, кажется, работает только с изображением напрямую. Кто-нибудь знает, как сделать 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
            }
        }
    }
}

Ответы [ 3 ]

1 голос
/ 15 июня 2019
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)
    }
}

И используйте это так.


struct ContentView: View {
    var body: some View {
        VStack {
            CustomImageView()
                .resizable()
        }
    }
}
0 голосов
/ 15 июня 2019

Попробуйте это:

struct CustomImageView: View {

    @State var isResizeable: Bool = false
    @State var capInsets: EdgeInsets = EdgeInsets()
    @State var resizingMode: Image.ResizingMode = .stretch

    var body : some View {

        ZStack {
            if isResizeable {
                Image("placeholder")
                    .resizable(capInsets: self.capInsets, resizingMode: self.resizingMode)
            }
            else {
                Image("placeholder")
            }
        }
    }

    func resizeable(capInsets: EdgeInsets = EdgeInsets(), resizingMode: Image.ResizingMode = .stretch) -> CustomImageView {
        return CustomImageView(isResizeable: true, capInsets: capInsets, resizingMode: resizingMode)
    }
}

struct ContentView : View {

    var body: some View {
        CustomImageView()
            .resizeable()
    }
}
0 голосов
/ 15 июня 2019

Проблема в том, что вы вызываете .resizable () для CustomeImageView, который имеет тип View.

Вам необходимо вызвать .resizable () для типа изображения.

Ваше изображение вложено в тело, то есть в CustomImageView.

struct CustomImageView : View {
    var body: some View {
        Image("someImage")
            .resizable()
    }
}

CustomImageView()

Причина, по которой это работает, заключается в том, что он вызывает .resizable в Image (), а не в представлении, как раньше.Надеюсь, это поможет!

Рекомендации:

https://developer.apple.com/documentation/swiftui/image https://developer.apple.com/documentation/swiftui/view

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...