【问题标题】:iOS Camera with multiple imageView outputs具有多个 imageView 输出的 iOS 相机
【发布时间】:2024-01-01 04:41:01
【问题描述】:

在我的 FirstVC 中,我了解如何使用 UIImagePickerController、加载相机、拍照、将其显示在 1 个 imageView 内(仍在 FirstVC 内),然后通过 prepareForSegue 将该图像传递给 SecondVC 内的一个 imageView 以显示那边。

我需要帮助的是在 FirstVC 中拥有多个 imageView,这样一旦用户拍摄第一张图片,它就会加载到第一个 imageView,然后第二张图片加载到第二个 imageView,第三个图片到第三个 imageView,第四个图片到第四个 imageView。之后会出现一个警报,提示用户不能再拍摄任何照片,并且用户将按下一个 nextSceneButton 被带到 SecondVC,它将显示他们刚刚拍摄的 4 个选择的图像。

我一直使用 UIImagePickerController,但我刚刚熟悉了 AVFoundation。我应该使用 AVFoundation 还是 UIImagePicker 来完成这项任务?

这是我的 UIImagePickerController 代码,FirstVC 内只有一个 imageView:

import UIKit

class FirstViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var nextSceneButton: UIButton!
//nextSceneButton is connected in StoryBoards and triggers the segue to the SecondVC


let imagePicker = UIImagePickerController()

var image: UIImage?



  //MARK:- Custom Function
func noCamera(){
        let alertVC = UIAlertController(title: "No Camera", message: "Sorry, this device has no camera", preferredStyle: .Alert)
        let okAction = UIAlertAction(title: "OK", style:.Default, handler: nil)
        alertVC.addAction(okAction)
        presentViewController(alertVC, animated: true, completion: nil)
    }


override func viewDidLoad() {
        super.viewDidLoad()
        imagePicker.delegate = self      
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

  //MARK:- Buttons

@IBAction func libraryButtonPressed(sender: UIButton) {
        imagePicker.allowsEditing = false
        imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary
        presentViewController(imagePicker, animated: true, completion: nil)
    }


@IBAction func photoButtonPressed(sender: UIButton) {

    if (UIImagePickerController.availableCaptureModesForCameraDevice(UIImagePickerControllerCameraDevice.Rear) != nil){
            imagePicker.allowsEditing = false
            imagePicker.sourceType = UIImagePickerControllerSourceType.Camera
            imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureMode.Photo
            imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.Rear
            presentViewController(imagePicker, animated: true, completion: nil)
        }else{
                noCamera()
    }
     }


  //MARK:- ImagePickerController Delegates

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
            let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
            self.image = chosenImage
            imageView.image = self.image
            dismissViewControllerAnimated(true, completion: nil)
     }


func imagePickerControllerDidCancel(picker: UIImagePickerController) {
            picker.dismissViewControllerAnimated(true, completion: nil)
     }


  //MARK:- Segue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == “fromPhotoVcToSecondVC” {
        let secondVC = segue.destinationViewController as! SecondViewController
        secondVC.image = self.image
        }
     }

}//end class

【问题讨论】:

  • 不需要使用 AvFoundation 来满足您的需要。只需在 didFinishPickingMediaWithInfo 中增加一个计数器,并在每次调用时加载相应的 Imageview。

标签: ios swift uiimageview avfoundation uiimagepickercontroller


【解决方案1】:

您可以添加计数属性并将图像保存在数组中:

var count = 0
var imageViews:[UIImageView]

每次您拍照并调用委托时都会加载相应的图像视图:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        let chosenImage = info[UIImagePickerControllerOriginalImage] as! UIImage
        self.imageViews[count].image = chosenImage
        count +=1
        dismissViewControllerAnimated(true, completion: nil)
 }

然后,如果所有照片都被拍摄,提醒用户:

@IBAction func photoButtonPressed(sender: UIButton) {
      if count < imageViews.count {
          //present UiimagePicker
      } else {
          // alert no more pictures allowed
      }
}

【讨论】: