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

#ios #swiftui #uiviewrepresentable #phlivephoto

#iOS #swiftui #uiviewrepresentable #phlivephoto

Вопрос:

Я пытаюсь создать базовое приложение 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(), похоже, не работает, все, что у меня есть, это обрезанное изображение. Ожидаемое поведение — у двух есть изображение с сохраненным соотношением сторон и пустое пространство на более короткой стороне. Возможно ли это вообще?

Ответ №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)
 

Комментарии:

1. Я люблю stack overflow и почти люблю вас сейчас за то, что вы ответили на мои вторые вопросы сегодня! Я потратил добрых два часа на борьбу, а затем вы принесли рабочее решение за три минуты. Это всего лишь небольшое замечание .scaleAspectFit , но оно работает!