ImageView внутри ScrollView показывает неправильное изображение - PullRequest
0 голосов
/ 26 марта 2020

У меня есть вид прокрутки, в который встроено изображение. Пользователь нажимает кнопку «Сделать фото», делает снимок, а затем эти фотографии сохраняются в массиве и затем отображаются в прокручиваемом изображении. Моя проблема заключается в том, что после вызова didFinishSelectingMedia и закрытия камеры imageView всегда показывает первое изображение в массиве. Я хочу, чтобы imageView показывал самое последнее изображение, добавленное в массив, и прокручивал изображения назад, пока пользователь не придет к первому изображению в массиве. Как мне это сделать?

Кстати: Idk, если это даже правдоподобно, но я попытался отменить для l oop, и это не сработало.

Я новичок программист, поэтому, пожалуйста, объясните свои ответы.

Вот мой код:

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet weak var scrollImageView: UIScrollView!


    var imageTaken: [UIImage] = []
    var imagePicker = UIImagePickerController()


    override func viewDidLoad() {

        super.viewDidLoad()

        scrollImageView.frame = scrollImageView.frame

    }



    @IBAction func takePhotoButton(_ sender: Any) {

        imagePicker = UIImagePickerController()
        imagePicker.delegate = self
        imagePicker.sourceType = .camera

        present(imagePicker, animated: true, completion: nil)

    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        imageTaken.append((info[.originalImage] as? UIImage)!)
        imagePicker.dismiss(animated: true, completion: nil)


        for i in 0..<imageTaken.count {
            let imageView = UIImageView()
            imageView.image = imageTaken[i]
            imageView.contentMode = .scaleAspectFit
            let xPosition = self.scrollImageView.frame.width * CGFloat(i)

            imageView.frame = CGRect(x: xPosition, y: 0, width: self.scrollImageView.frame.width, height: self.scrollImageView.frame.height)

            scrollImageView.contentSize.width = scrollImageView.frame.width * CGFloat(i + 1)
            scrollImageView.addSubview(imageView)

        }


    }

}

1 Ответ

0 голосов
/ 26 марта 2020

Два варианта, я думаю, вы можете выбрать любой, который кажется проще.

  1. OOP - Создать массив объектов, например:
struct TakePhotos {

var image : UIImage
var timestamp : Date

}

Затем отсортировать массив по отметке времени.

Использование PHAsset

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

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

let photoOptions = PHFetchOptions()
                photoOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

Это то, что я сделал в своем приложении.

// FIXME: - Query only happens once this needs to be refactored so it happens when the album is updated on the device.
            // Query only happens one time.
            if imageArray.isEmpty {

                let photoOptions = PHFetchOptions()
                photoOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]

                let allPhotos = PHAsset.fetchAssets(with: photoOptions)

                let fetchOptions = PHImageRequestOptions()
                fetchOptions.deliveryMode = .highQualityFormat
                fetchOptions.resizeMode = .exact
                fetchOptions.normalizedCropRect = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.width)

                // Must be a synchronous call otherwise the view loads before images are retrieved (result is an empty view).
                fetchOptions.isSynchronous = true

                let imageSize : CGSize = CGSize(width: view.frame.width, height: view.frame.height)

                //Retrieves Images using assets.
                allPhotos.enumerateObjects { (assets, index, pointer) in

                    DispatchQueue.global(qos: .background).sync {

                        PHImageManager.default().requestImage(for: assets, targetSize: imageSize, contentMode: .aspectFit, options: fetchOptions) { (image, hashDictionary) in
                            guard let image = image else {return}
                            self.imageArray.append(image)
                            self.albumImages.append(ImageAlbum(images: image))
                        }
                    }
                }

                selectedImage.image = imageArray.first
                selectedImage.contentMode = .scaleAspectFill
            }
...