3

在我的应用程序中,我希望用户能够拍照,呈现图片,并且通过点击照片可以添加文本字段,以便他们可以在图像上书写。这与在 Snapchat 中为图片添加文字的功能完全相同。

据我所知,在拍摄并能够编辑图像后呈现图像的唯一方法是设置:

       imagePicker.showsCameraControls = false

制作自定义叠加层:

@IBAction func takePhoto(sender: UIButton) {
    imagePicker =  UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = .Camera
    imagePicker.showsCameraControls = false
    imagePicker.allowsEditing = true

    let overlayView = UIView(frame: CGRectMake(0, self.view.frame.width, self.view.frame.width, self.view.frame.height-self.view.frame.width))
    overlayView.backgroundColor = UIColor.blackColor()
    overlayView.alpha = 0.5
    println(overlayView)

    let snapButton = UIView(frame: CGRectMake(150, 160, 80, 80))
    snapButton.layer.cornerRadius = 40
    snapButton.userInteractionEnabled = true
    snapButton.backgroundColor = UIColor.purpleColor()
    overlayView.addSubview(snapButton)
    overlayView.bringSubviewToFront(snapButton)
    let recognizer = UITapGestureRecognizer(target: self, action:Selector("handleSnapTap:"))
    recognizer.delegate = self
    snapButton.addGestureRecognizer(recognizer)

    let cancelButton = UIView(frame: CGRectMake(40, 40, 44, 44))
    cancelButton.layer.cornerRadius = 22
    cancelButton.userInteractionEnabled = true
    cancelButton.backgroundColor = UIColor.redColor()
    overlayView.addSubview(cancelButton)
    overlayView.bringSubviewToFront(cancelButton)
    let cancelRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleCancelTap:"))
    cancelRecognizer.delegate = self
    cancelButton.addGestureRecognizer(cancelRecognizer)


    let changeCameraButton = UIView(frame: CGRectMake(165, 40, 44, 44))
    changeCameraButton.layer.cornerRadius = 22
    changeCameraButton.userInteractionEnabled = true
    changeCameraButton.backgroundColor = UIColor.blueColor()
    overlayView.addSubview(changeCameraButton)
    overlayView.bringSubviewToFront(changeCameraButton)
    let changeCameraRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleChangeCameraTap:"))
    changeCameraRecognizer.delegate = self
    changeCameraButton.addGestureRecognizer(changeCameraRecognizer)

    let flashButton = UIView(frame: CGRectMake(300, 40, 44, 44))
    flashButton.layer.cornerRadius = 22
    flashButton.userInteractionEnabled = true
    flashButton.backgroundColor = UIColor.yellowColor()
    overlayView.addSubview(flashButton)
    overlayView.bringSubviewToFront(flashButton)
    let flashRecognizer = UITapGestureRecognizer(target: self, action:Selector("handleFlashTap:"))
    flashRecognizer.delegate = self
    flashButton.addGestureRecognizer(flashRecognizer)

    imagePicker.cameraOverlayView = overlayView

    presentViewController(imagePicker, animated: true, completion: nil)
}

func handleSnapTap(recognizer: UITapGestureRecognizer) {
   println("Take picture")
    imagePicker.takePicture()
    self.performSegueWithIdentifier("cameraToImageViewSegue", sender: self)

}

func handleCancelTap(recognizer: UITapGestureRecognizer) {
    println("Cancel")
     self.imagePicker.dismissViewControllerAnimated(true, completion: nil)
}

func handleChangeCameraTap(recognizer: UITapGestureRecognizer) {

    if (hasChangedCamera == nil){
   imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.Front
        hasChangedCamera = true
        return
    }

    if (hasChangedCamera == true){
        imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.Rear
        hasChangedCamera = false
        return
    }

    if (hasChangedCamera! == false){
        imagePicker.cameraDevice = UIImagePickerControllerCameraDevice.Front
        hasChangedCamera = true
        return

    }
}

func handleFlashTap(recognizer: UITapGestureRecognizer) {

    if (hasTurnedOnFlash == nil){
        imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.On
        hasTurnedOnFlash = true
        return
    }

    if (hasTurnedOnFlash == true){
        imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.Off
        hasTurnedOnFlash = false
        return
    }

    if (hasTurnedOnFlash == false){
        imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashMode.On
        hasTurnedOnFlash = true
        return
    }

}

最后呈现一个新的视图控制器,其中拾取的图像放置在 UIView 中,并从那里编辑它。我的问题是如何直接从 UIImagePickerController 到新的视图控制器。我尝试了以下方法:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {

    self.imagePicker.dismissViewControllerAnimated(false, completion: nil)
   let vc = ModifyCameraImageViewController() //change this to your class name
    self.presentViewController(vc, animated: false, completion: nil)

}

首先,这只会导致黑屏,但我确信有一个足够简单的方法来解决这个问题。我的主要问题是,在下一个视图控制器出现之前,显示 UIImagePickerController 的视图控制器会短暂出现在屏幕上。这显然不好看。我还尝试删除dismissViewController 函数,以及将presentViewController 函数放在dismissView 控制器函数之上。这两种尝试都给了我错误信息:

Warning: Attempt to present <xxx.ModifyCameraImageViewController: 0x145e3eb70> on <xxx.ViewController: 0x145d20a60> whose view is not in the window hierarchy!

尝试将 performSegueWithIdentifier 与链接底层视图和下一个视图控制器的 segue 一起使用会给出相同的错误警告。

我发现了以下类似的问题,但我对 Objective C 完全无能为力,所以我很难理解它:Push a viewController from the UIImagePickerController camera view

那么,任何人都可以就如何直接从 UIImagePickerController 呈现视图控制器提供帮助吗?

另外,请记住,我这样做是为了能够在新选择的图像上创建文本覆盖(如在 Snapchat 中),所以如果有人对此有更优雅的解决方案,请随时发布!

谢谢!

4

2 回答 2

5

好的,找到了一个简单的解决方案来解决我的问题。当按下 takePicture 按钮时,不要从底层视图控制器呈现 imagePickerController 并直接从那里连接到另一个视图控制器,而是使用 takePicture 按钮连接到另一个视图控制器并从第二个视图控制器的 viewDidLoad 呈现 imagePickerController。当 imagePickerController 被解除时,第二个视图控制器将被呈现。然而,这需要底层视图控制器看起来类似于相机控件,并且需要一些动画来让它看起来很自然。

于 2015-07-14T08:55:05.307 回答
0
let pickerController: Void = picker.dismissViewControllerAnimated(true) { _ in
        UIImageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
        self.performSegueWithIdentifier("segueIdentifier", sender: nil)
        //Do what you want when picker is dismissed
    }
于 2015-11-05T19:25:11.157 回答