Добавление нескольких изображений в представление из библиотеки фотографий – SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Добавление нескольких изображений в представление из библиотеки фотографий – SwiftUI

Сообщение Anonymous »

Я хочу добавить изображения из библиотеки фотографий телефона в созданный мной макет коллажа. Сначала я создал макет коллажа в виде отдельного представления в SwiftUI под названием CollageLayoutOne.
import SwiftUI

struct CollageLayoutOne: View {

var uiImageOne: UIImage
var uiImageTwo: UIImage
var uiImageThree: UIImage

var body: some View {

Rectangle()
.fill(Color.gray)
.aspectRatio(1.0, contentMode: .fit)
.overlay {
HStack {
Rectangle()
.fill(Color.gray)
.overlay {
Image(uiImage: uiImageOne)
.resizable()
.aspectRatio(contentMode: .fill)
}
.clipped()
VStack {
Rectangle()
.fill(Color.gray)
.overlay {
Image(uiImage: uiImageTwo)
.resizable()
.aspectRatio(contentMode: .fill)
}
.clipped()
Rectangle()
.fill(Color.gray)
.overlay {
Image(uiImage: uiImageThree)
.resizable()
.aspectRatio(contentMode: .fill)
}
.clipped()
}
}
.padding()
}
}
}

Затем у меня есть отдельное представление (PageView), в котором я хочу показать представление CollageLayoutOne, а также там находится кнопка для перехода к библиотеке изображений.
struct PageView: View {

@State private var photoPickerIsPresented = false
@State var pickerResult: [UIImage] = []

var body: some View {
NavigationView {
ScrollView {
if pickerResult.isEmpty {

} else {
CollageLayoutOne(uiImageOne: pickerResult[0], uiImageTwo: pickerResult[1], uiImageThree: pickerResult[2])
}

}
.edgesIgnoringSafeArea(.bottom)
.navigationBarTitle("Select Photo", displayMode: .inline)
.navigationBarItems(trailing: selectPhotoButton)
.sheet(isPresented: $photoPickerIsPresented) {
PhotoPicker(pickerResult: $pickerResult,
isPresented: $photoPickerIsPresented)
}
}
}

@ViewBuilder
private var selectPhotoButton: some View {
Button(action: {
photoPickerIsPresented = true
}, label: {
Label("Select", systemImage: "photo")
})
}

}

Моя проблема в том, что по неизвестной причине приложение вылетает каждый раз, когда я выбираю фотографии и пытаюсь их добавить. Если я выполню PickerResult[0] для всех трех, он работает нормально, но отображает только первую выбранную фотографию во всех трех местах. Кроме того, если я начну со всех 3 как PickerResult[0], а затем изменю их на [0], [1], [2] во время предварительного просмотра, он не выйдет из строя и будет отображаться правильно.
Я только начинаю изучать Swift и SwiftUI, так что извините, если это какая-то элементарная ошибка. Ниже я также добавляю свой код для PhotoPicker, который я получил из найденной статьи.
[img]https://i.stack. imgur.com/f74DM.jpg[/img]

PhotoPicker.swift:
import SwiftUI
import PhotosUI

struct PhotoPicker: UIViewControllerRepresentable {
@Binding var pickerResult: [UIImage]
@Binding var isPresented: Bool

func makeUIViewController(context: Context) -> some UIViewController {
var configuration = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
configuration.filter = .images // filter only to images
if #available(iOS 15, *) {
configuration.selection = .ordered //number selection
}
configuration.selectionLimit = 3 // ignore limit

let photoPickerViewController = PHPickerViewController(configuration: configuration)
photoPickerViewController.delegate = context.coordinator
return photoPickerViewController
}

func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) { }

func makeCoordinator() -> Coordinator {
Coordinator(self)
}

class Coordinator: PHPickerViewControllerDelegate {
private let parent: PhotoPicker

init(_ parent: PhotoPicker) {
self.parent = parent
}

func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
parent.pickerResult.removeAll()

for image in results {
if image.itemProvider.canLoadObject(ofClass: UIImage.self) {
image.itemProvider.loadObject(ofClass: UIImage.self) { [weak self] newImage, error in
if let error = error {
print("Can't load image \(error.localizedDescription)")
} else if let image = newImage as? UIImage {
self?.parent.pickerResult.append(image)
}
}
} else {
print("Can't load asset")
}
}

parent.isPresented = false
}
}
}


Подробнее здесь: https://stackoverflow.com/questions/711 ... ry-swiftui
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»