Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView在添加AVCaptureVideoPreviewLayer子视图时忽略大小约束_Ios_Swift_Uiview_Avfoundation - Fatal编程技术网

Ios UIView在添加AVCaptureVideoPreviewLayer子视图时忽略大小约束

Ios UIView在添加AVCaptureVideoPreviewLayer子视图时忽略大小约束,ios,swift,uiview,avfoundation,Ios,Swift,Uiview,Avfoundation,你好,星期一快乐 我正在尝试建立一个定制相机,类似于Instagram的外观 首先,我使用故事板添加UIView,将UIView垂直和水平居中,并通过故事板将宽度和高度设置为200 然后,在我的代码中,我将AVCaptureVideoPreviewLayer添加到我的UIView中,我称之为cameraView,然后将AVCaptureVideoPreviewLayer的帧设置为我的UIView帧 问题:似乎忽略了UIView的宽度和高度约束。摄影机预览应该位于视图的正中心,但它不是。我做错了什

你好,星期一快乐

我正在尝试建立一个定制相机,类似于Instagram的外观

首先,我使用故事板添加UIView,将UIView垂直和水平居中,并通过故事板将宽度和高度设置为200

然后,在我的代码中,我将AVCaptureVideoPreviewLayer添加到我的UIView中,我称之为
cameraView
,然后将AVCaptureVideoPreviewLayer的帧设置为我的UIView帧

问题:似乎忽略了UIView的宽度和高度约束。摄影机预览应该位于视图的正中心,但它不是。我做错了什么?我想这与预览层有关。或者我需要使用UIImageView而不是UIView

任何意见都将不胜感激!谢谢

这是一个截图,它看起来像什么。。。注意:高亮显示图像以查看屏幕截图的边缘位置,对此表示抱歉

我的代码:

extension String {
func stripCharactersInSet(chars: [Character]) -> String {
    return String(filter(self) {find(chars, $0) == nil})
}
}

class MyCameraViewController: UIViewController {

let session = AVCaptureSession()
var captureDevice: AVCaptureDevice?
var previewLayer: AVCaptureVideoPreviewLayer?
var stillImageOutput = AVCaptureStillImageOutput()
var imageData: NSData!

@IBOutlet weak var capturePhotoButton: UIButton!
@IBOutlet weak var flashButton: UIButton!
@IBOutlet weak var cameraView: UIView!

override func prefersStatusBarHidden() -> Bool {
    return true
}

override func viewDidLoad() {
    super.viewDidLoad()
    //flashButton.hidden = true

    if(session.canSetSessionPreset(AVCaptureSessionPresetHigh)) {
        session.sessionPreset = AVCaptureSessionPresetHigh
    } else {
        println("Cannot Set session Preset to AVCaptureSessionPresetPhoto")
    }

    let devices = AVCaptureDevice.devices()
    for device in devices {
        if(device.hasMediaType(AVMediaTypeVideo)){
            if(device.position == AVCaptureDevicePosition.Front){
                captureDevice = device as? AVCaptureDevice
                if captureDevice != nil {
                    beginSession()

                }
            }
        }
    }
}

func setCaptureDevice() {
    let devices = AVCaptureDevice.devices()
    for device in devices {
        if(device.hasMediaType(AVMediaTypeVideo)){
            if(device.position == AVCaptureDevicePosition.Back){
                captureDevice = device as? AVCaptureDevice

            }
        }
    }

}

@IBAction func flashButtonPressed(sender: UIButton) {
    if captureDevice!.hasFlash {
        if captureDevice!.isFlashModeSupported(AVCaptureFlashMode.On) {
            if (captureDevice!.lockForConfiguration(nil)) {
                if (captureDevice!.flashActive) {
                    captureDevice!.flashMode = AVCaptureFlashMode.Off
                    flashButton.setTitle("Flash Off", forState: UIControlState.Normal)
                } else {
                    captureDevice!.flashMode = AVCaptureFlashMode.On
                    flashButton.setTitle("Flash On", forState: UIControlState.Normal)
                }
            }
            captureDevice!.unlockForConfiguration()
        }
    }
}

@IBAction func switchCamera(sender: UIButton) {
    let currentCameraInput: AVCaptureInput = session.inputs[0] as! AVCaptureInput
    session.removeInput(currentCameraInput)

    let newCamera: AVCaptureDevice?
    if(captureDevice!.position == AVCaptureDevicePosition.Back){
        println("Setting new camera with Front")
        flashButton.hidden = true
        newCamera = self.cameraWithPosition(AVCaptureDevicePosition.Front)
    } else {
        println("Setting new camera with Back")
        flashButton.hidden = false
        newCamera = self.cameraWithPosition(AVCaptureDevicePosition.Back)
    }

    let newVideoInput = AVCaptureDeviceInput(device: newCamera!, error: nil)
    if(newVideoInput != nil) {
        session.addInput(newVideoInput)
    } else {
        println("Error creating capture device input")
    }
    captureDevice! = newCamera!
    session.commitConfiguration()

}

func cameraWithPosition(position: AVCaptureDevicePosition) -> AVCaptureDevice {
    let devices = AVCaptureDevice.devices()
    for device in devices {
            if(device.position == position){
                return device as! AVCaptureDevice
            }
    }
    return AVCaptureDevice()
}

func beginSession() {
    if(captureDevice!.isFocusModeSupported(AVCaptureFocusMode.ContinuousAutoFocus)) {
            captureDevice?.focusMode = AVCaptureFocusMode.ContinuousAutoFocus
        }

    var err : NSError? = nil
    //Add Input, which is my captureDevice
    session.addInput(AVCaptureDeviceInput(device: captureDevice, error: &err))
    if err != nil {
        println("error: \(err?.localizedDescription)")
    }
    previewLayer = AVCaptureVideoPreviewLayer(session: session)



    //self.view.layer.addSublayer(previewLayer)
    cameraView.layer.addSublayer(previewLayer)

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

    session.startRunning()
}

struct imageViewStruct {
    static var image: UIImage?
}

@IBAction func shotPress(sender: UIButton) {
    stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
    if session.canAddOutput(stillImageOutput) {
        session.addOutput(stillImageOutput)
    }
    var videoConnection = stillImageOutput.connectionWithMediaType(AVMediaTypeVideo)

    if videoConnection != nil {
        stillImageOutput.captureStillImageAsynchronouslyFromConnection(stillImageOutput.connectionWithMediaType(AVMediaTypeVideo))
            { (imageDataSampleBuffer, error) -> Void in
                self.imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataSampleBuffer)
                var dataProvider = CGDataProviderCreateWithCFData(self.imageData)
                var cgImageRef = CGImageCreateWithJPEGDataProvider(dataProvider, nil, true, kCGRenderingIntentDefault)
                var image = UIImage(CGImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.Up)

                imageViewStruct.image = image

                //self.uploadPhoto(image!)

                self.presentPhotoEditViewController(image!)                    
        }}

}

func setupPhotoEditor() {
    //Remove existing camera stuff
    previewLayer?.removeFromSuperlayer()
}

func presentPhotoEditViewController(imageToSend: UIImage) {
    let vc = self.storyboard?.instantiateViewControllerWithIdentifier("photoEditor") as! PhotoEditViewController
    self.presentViewController(vc, animated: true, completion: nil)
}

func uploadPhoto(image: UIImage) {
    let imageData = UIImagePNGRepresentation(image)
    let imageFile = PFFile(name:"image.png", data:imageData)

    var userPhoto = PFObject(className:getStringForVenue())
    userPhoto["imageFile"] = imageFile
    userPhoto.saveInBackground()
}

func getStringForVenue() -> String {

    let initialVenueString = LocViewController.variables.selectedVenue
    let chars: [Character] = ["'",",",":"," "]

    println(initialVenueString.stripCharactersInSet(chars))

    return initialVenueString.stripCharactersInSet(chars)
}

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

}
您的方法bigSession()应该对AVCaptureVideoPreviewLayer进行一些设置:setVideoGravity和setFrame

OBJ-C

[previewLayer setVideoGravity: AVLayerVideoGravityResizeAspectFill];
[previewLayer setFrame:self.cameraView.layer.bounds];
这将设置视频纵横比视图,以适合为其指定的视图层的帧