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)

}

まず、これは黒い画面につながるだけですが、それを回避する簡単な方法があると確信しています. 私の主な問題は、次のView Controllerが表示される前に、UIImagePickerControllerが表示されたView Controllerが画面に短時間表示されるという事実です。これは明らかに見栄えがよくありません。また、dismissViewController 関数を削除し、presentViewController 関数を DismissView コントローラー関数の上に配置しようとしました。これらの試行の両方で、次のエラー メッセージが表示されました。

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

基になるビューと次のビュー コントローラーをリンクするセグエで performSegueWithIdentifier を使用しようとすると、同じエラー警告が表示されます。

次の同様の質問を見つけましたが、私は Objective C に完全に不慣れなので、意味を理解するのに苦労しています: UIImagePickerController カメラ ビューから viewController をプッシュします。

では、UIImagePickerController から直接ビュー コントローラーを提示する方法について、誰か助けてもらえますか?

また、新しく選択した画像 (Snapchat のように) にテキスト オーバーレイを作成できるようにするためにこれを行っていることを覚えておいてください。

ありがとう!

4

2 に答える 2

5

わかりました、私の問題に対する簡単な解決策を見つけました。takePicture ボタンが押されたときに基になるビュー コントローラーから imagePickerController を提示し、そこから別のビュー コントローラーに直接セグエする代わりに、takePicture ボタンを使用して別のビュー コントローラーにセグエし、2 番目のビュー コントローラーの viewDidLoad から imagePickerController を提示します。imagePickerController が閉じられると、2 番目のビュー コントローラーが表示されます。ただし、これには、基になるビュー コントローラーがカメラ コントロールに似ている必要があり、これが自然に見えるようにアニメーションをいじる必要があります。

于 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 に答える