SwiftUI: как изменить размер вывода UIViewRepresentable?

Я пытаюсь создать базовое приложение Live Photo на SwiftUI и борюсь с отображением выбранной фотографии. Для этого я попытался сделать UIViewRepresentable для PHLivePhotoView:

import SwiftUI
import PhotosUI

struct LivePhotoView: UIViewRepresentable {
    @Binding var livephoto: PHLivePhoto

    func makeUIView(context: Context) -> PHLivePhotoView {
        return PHLivePhotoView()
    }

    func updateUIView(_ lpView: PHLivePhotoView, context: Context) {
        lpView.livePhoto = livephoto
    }
}

В моем главном представлении я называю это так:

if pickerResult.count > 0 {
    LivePhotoView(livephoto: $pickerResult[0])
}

Он отлично работает до того момента, когда я пытаюсь ограничить размер представления. Я хочу поместить предварительный просмотр в квадратную рамку с чем-то вроде этого

LivePhotoView(livephoto: $pickerResult[0])
    .scaledToFit()
    .frame(width: geo.size.width, height: geo.size.width, alignment: .center)

Но scaledToFit(), похоже, не работает, все, что у меня есть, это обрезанное изображение. Ожидаемое поведение состоит в том, чтобы иметь изображение с сохраненным соотношением сторон и пустым пространством на более короткой стороне. Это вообще возможно?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
1 275
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сделайте это в исходном виде, а в SwiftUI ограничьте только кадр, например

func makeUIView(context: Context) -> PHLivePhotoView {
    let photoView = PHLivePhotoView()
    photoView.contentMode = .scaleAspectFit
    return photoView
}

И (или даже без) модификатора frame

LivePhotoView(livephoto: $pickerResult[0])
    .frame(width: geo.size.width, height: geo.size.width, alignment: .center)

Я люблю переполнение стека и почти люблю вас за ответы на мои вторые вопросы сегодня! Я потратил добрых два часа на борьбу, а потом ты принес рабочее решение за три минуты. Небольшое замечание, это .scaleAspectFit, но это работает!

Igor Kashin 21.12.2020 11:32

Другие вопросы по теме