cameraアプリのcameraOverlayViewの方法
アプリで遊んでいる姿をインカメを利用してカメラやビデオで撮影する事が出来ないか試しています。
カメラをUIImagePickerで設定すると、カメラ起動で必ずカメラビューが現れます。
そこで、別のビュー(OverlayView)を保ったまま、インカメだけを利用して別のビュー(OverlayView)の画面をタップして写真が撮れる方法を探しています。
カメラ起動でOverlayViewを上に乗せる事は出来たのですが、シャッターの切り方が分かりません。
ようは、カメラのインターフェイスを出さずに、カメラを撮る方法がないか試行錯誤していて、
カメラを起動した時にその上に別のViewを作り、そこでゲーム的なアニメーションを作る方法でどうかと思いました。
根本的に考え方が間違っているのかも?
どなたかご教授願えないでしょうか? よろしくお願い致します。
試しているコードは下記の通りです。
ViewController.swift
import UIKit
class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate {
@IBOutlet weak var photoLibraryButton: UIButton!
@IBOutlet weak var cameraButton: UIButton!
@IBOutlet weak var photoImageView: UIImageView!
// let overlayview = OverlayView()
override func viewDidLoad() {
super.viewDidLoad()
// overlayview .removeFromSuperview()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func photoLibraryAction(sender: UIButton) {
let picker = UIImagePickerController()
picker.delegate = self
picker.sourceType = .PhotoLibrary
picker.allowsEditing = true
presentViewController(picker, animated: true, completion: nil)
}
// カメラを起動
@IBAction func cameraAction(sender: UIButton) {
let picker = UIImagePickerController()
picker.delegate = self
if UIImagePickerController.isSourceTypeAvailable(.Camera)
{
picker.sourceType = .Camera
let overlayView = OverlayView(frame: picker.view.frame)
picker.cameraOverlayView = overlayView
// // 撮影ボタン等を隠す。
// picker.showsCameraControls = false
// インカメで撮る。
picker.cameraDevice = .Front
}else{
picker.sourceType = .PhotoLibrary
}
presentViewController(picker, animated: true, completion: nil)
}
// 撮影が完了した時に呼ばれる。
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage
{
photoImageView.contentMode = .ScaleAspectFit
photoImageView.image = pickedImage
saveImage()
}
// 閉じる処理
dismissViewControllerAnimated(true, completion: nil)
}
// 写真を保存
func saveImage()
{
let image: UIImage! = photoImageView.image
if image != nil {
UIImageWriteToSavedPhotosAlbum(image, self, #selector(ViewController.image(_:didFinishSavingWithError:contextInfo:)), nil)
}else{
print("error, image failed !")
}
}
// 書き込み完了結果の受け取り
func image(image:UIImage, didFinishSavingWithError error: NSError!, contextInfo: UnsafeMutablePointer<Void>)
{
if error != nil {
print(error.code)
print("Save Failed !")
}
else{
print("Save Succeeded")
}
}
// 撮影をcancel
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}
OverlayView.swift
import UIKit
class OverlayView: UIView {
var view : UIView!
@IBOutlet weak var ratImage: UIImageView!
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
}
// xibからカスタムViewを読み込んで準備する
func setup()
{
// MyCustomView.xib からカスタムViewをロードする
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: "OverlayView", bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
addSubview(view)
// カスタムViewのサイズを自分自身と同じサイズにする
view.translatesAutoresizingMaskIntoConstraints = false
let bindings = ["view": view]
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: NSLayoutFormatOptions(rawValue:0), metrics: nil, views: bindings))
addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: NSLayoutFormatOptions(rawValue:0), metrics: nil, views: bindings))
}
@IBAction func testButtonTapped(sender: UIButton) {
print("button tapped")
// ここでシャッターが切れるようにして写真やビデオを撮影する
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/
}