SwiftUI Custom Image Modifier - PullRequest
       1

SwiftUI Custom Image Modifier

1 голос
/ 02 февраля 2020

Я пытаюсь создать пользовательский модификатор изображения, который использует функцию resizable(), поэтому мой content должен быть Image. По крайней мере, так я думаю.

Сообщение об ошибке : Тип 'IconModifier' не соответствует протоколу 'ViewModifier'

struct IconModifier: ViewModifier {
    func body(content: Image) -> some View {
        content
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 10, height: 10, alignment: .center)
    }
}

1 Ответ

5 голосов
/ 02 февраля 2020

Решение

Вместо него можно просто расширить Image.

Используется примерно так:

struct ContentView: View {

    var body: some View {
        VStack {
            Text("Hello World!")

            Image("someName")
                .imageIconModifier()
        }
    }
}

Image расширение:

extension Image {

    func imageIconModifier() -> some View {
        self
            .resizable()
            .aspectRatio(contentMode: .fit)
            .frame(width: 10, height: 10, alignment: .center)
    }
}

Почему ваше решение не будет работать

Сначала вы получили ошибку:

Тип 'IconModifier' не соответствует протоколу 'ViewModifier'

Это означает, что ваш IconModifier не удовлетворял требованиям протокола ViewModifier, который, если мы увидим определение:

func body(content: Self.Content) -> Self.Body

, тогда как у вас было:

func body(content: Image) -> Self.Body

, который не работает. Итак, далее - мы изменим это на Content вместо Image:

Значение типа 'IconModifier.Content' (он же _ViewModifier_Content ') не имеет члена' resizable '

Это в основном говорит о том, что для любого View нет модификатора .resizable(). Модификатор .resizable() внутри определен только внутри extension Image, поэтому никакой другой модификатор View не имеет этого модификатора.

И это основная проблема - у него нет доступа к оригинальному View (Image для того, что мы хотим) через параметр content в ViewModifier.

Именно поэтому я только что сделал расширение для Image.

Надеюсь, это объяснение поможет!

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