View内のiPhoneでカメラを使用したいのですが。私は典型的なフルスクリーンカメラビューを使いたくありませんが、私自身のものです。
たとえば、画面の中央に200x200の正方形を配置し、カメラのプレビューを表示したいとします。この広場の下に写真を撮るためのボタンが欲しいのですが。どうやるか?私はSwift初心者です。
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
うまくいけば、これが役立つことができます。そうでない場合、私はもう少し助けようとするか、誰かが私を訂正することができます。
幸運を!
別のコードブロック。 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
}
}
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)
}