web-dev-qa-db-ja.com

カスタムカメラビューSwift iOS 8 iPhone Xcode 6.1

View内のiPhoneでカメラを使用したいのですが。私は典型的なフルスクリーンカメラビューを使いたくありませんが、私自身のものです。

たとえば、画面の中央に200x200の正方形を配置し、カメラのプレビューを表示したいとします。この広場の下に写真を撮るためのボタンが欲しいのですが。どうやるか?私はSwift初心者です。

7
Adam Smaka

AVFoundationフレームワークを使用して、ストーリーボードで作成したビュー内に独自のAVCaptureSessionを作成できるようにする必要があります。これは、カメラを見つけてキャプチャセッションを作成する方法を示す素晴らしいチュートリアルです。

http://jamesonquave.com/blog/taking-control-of-the-iphone-camera-in-ios-8-with-Swift-part-1/

このチュートリアルでは、ビュー全体をキャプチャビューとして使用するため、コードに基づいてモデル化した場合のカメラのサイズはこのようになります。画面の中央に200x200の正方形を作成するには、ストーリーボードのView Controllerで正方形を描画し、すべてのコードが含まれるSwiftファイルの変数にリンクする必要があります。 、次に、下部にある「

previewLayer?.frame = self.view.layer.frame

to your200by200View.layer.frame

うまくいけば、これが役立つことができます。そうでない場合、私はもう少し助けようとするか、誰かが私を訂正することができます。

幸運を!

10

別のコードブロック。 iPhoneでマニュアルフォーカスを行う方法。

import UIKit

class ViewController: UIViewController {

    @IBOutlet var cameraView: CameraView!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func sliderChanged(sender: UISlider) {
        cameraView.setFocusWithLensPosition(sender.value)
    }
}


import UIKit
import AVFoundation

class CameraView: UIView {

    // AVFoundation properties
    let captureSession = AVCaptureSession()
    var captureDevice: AVCaptureDevice!
    var captureDeviceFormat: AVCaptureDeviceFormat?
    let stillImageOutput = AVCaptureStillImageOutput()
    var cameraLayer: AVCaptureVideoPreviewLayer?

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        initCamera()
    }

    func initCamera() {
        captureSession.beginConfiguration()


        stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]

        // get the back camera
        if let device = cameraDeviceForPosition(AVCaptureDevicePosition.Back) {

            captureDevice = device
            captureDeviceFormat = device.activeFormat

            let error: NSErrorPointer = nil

            do {
                try captureDevice!.lockForConfiguration()
            } catch let error1 as NSError {
                error.memory = error1
            }
            captureDevice!.focusMode = AVCaptureFocusMode.Locked
            captureDevice!.unlockForConfiguration()

            var deviceInput: AVCaptureDeviceInput!
            do {
                deviceInput = try AVCaptureDeviceInput(device: captureDevice)
            } catch let error1 as NSError {
                error.memory = error1
                deviceInput = nil
            }
            if(error == nil) {
                captureSession.addInput(deviceInput)
            }

            captureSession.addOutput(stillImageOutput)

            // use the high resolution photo preset
            captureSession.sessionPreset = AVCaptureSessionPresetPhoto


            // setup camera preview
            cameraLayer = AVCaptureVideoPreviewLayer(session: captureSession)


            if let player = cameraLayer {
                player.videoGravity = AVLayerVideoGravityResizeAspectFill
                self.layer.addSublayer(player)
                player.frame = self.layer.bounds
                player.connection.videoOrientation = AVCaptureVideoOrientation.LandscapeRight
            }

            // commit and start capturing
            captureSession.commitConfiguration()
            captureSession.startRunning()
        }

        captureSession.commitConfiguration()
    }

    func setFocusWithLensPosition(pos: CFloat) {
        let error: NSErrorPointer = nil
        do {
            try captureDevice!.lockForConfiguration()
        } catch let error1 as NSError {
            error.memory = error1
        }
        captureDevice!.setFocusModeLockedWithLensPosition(pos, completionHandler: nil)
        captureDevice!.unlockForConfiguration()
    }

    // return the camera device for a position
    func cameraDeviceForPosition(position:AVCaptureDevicePosition) -> AVCaptureDevice?
    {
        for device:AnyObject in AVCaptureDevice.devices() {
            if (device.position == position) {
                return device as? AVCaptureDevice;
            }
        }

        return nil
    }

}
5
Durul Dalkanat

cameraOverlayViewを追加して、画面の中央に200x200の正方形の表示ウィンドウを作成する方法の例:

@IBAction func takePhoto(sender: AnyObject) {

    if !UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera){
        return
    }

    var imagePicker = UIImagePickerController()
    imagePicker.delegate = self
    imagePicker.sourceType = UIImagePickerControllerSourceType.Camera;

    //Create camera overlay
    let pickerFrame = CGRectMake(0, UIApplication.sharedApplication().statusBarFrame.size.height, imagePicker.view.bounds.width, imagePicker.view.bounds.height - imagePicker.navigationBar.bounds.size.height - imagePicker.toolbar.bounds.size.height)
    let squareFrame = CGRectMake(pickerFrame.width/2 - 200/2, pickerFrame.height/2 - 200/2, 200, 200)
    UIGraphicsBeginImageContext(pickerFrame.size)

    let context = UIGraphicsGetCurrentContext()
    CGContextSaveGState(context)
    CGContextAddRect(context, CGContextGetClipBoundingBox(context))
    CGContextMoveToPoint(context, squareFrame.Origin.x, squareFrame.Origin.y)
    CGContextAddLineToPoint(context, squareFrame.Origin.x + squareFrame.width, squareFrame.Origin.y)
    CGContextAddLineToPoint(context, squareFrame.Origin.x + squareFrame.width, squareFrame.Origin.y + squareFrame.size.height)
    CGContextAddLineToPoint(context, squareFrame.Origin.x, squareFrame.Origin.y + squareFrame.size.height)
    CGContextAddLineToPoint(context, squareFrame.Origin.x, squareFrame.Origin.y)
    CGContextEOClip(context)
    CGContextMoveToPoint(context, pickerFrame.Origin.x, pickerFrame.Origin.y)
    CGContextSetRGBFillColor(context, 0, 0, 0, 1)
    CGContextFillRect(context, pickerFrame)
    CGContextRestoreGState(context)

    let overlayImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext();

    let overlayView = UIImageView(frame: pickerFrame)
    overlayView.image = overlayImage
    imagePicker.cameraOverlayView = overlayView
    self.presentViewController(imagePicker, animated: true, completion: nil)

}
3
Lyndsey Scott