2017-02-03 7 views
1

現在、私はSwiftアプリケーションでAVCaptureSessionを実行していますが、カメラフィード上で移動したいCGRectを持つUIViewがあります。私は、captureOutput関数の座標を変更することによってUIViewのフレームの位置を更新しようとしていますが、私はそれらを変更するので、更新していません。 UIViewの場所を変更して即座に更新するための適切な方法は何ですか?ここcaptureOutput内のUIViewの位置を変更します

は、キャプチャセッションが行われるコードのセクションの:

class CameraViewController: UIViewController, UIImagePickerControllerDelegate, AVCaptureVideoDataOutputSampleBufferDelegate 

{

@IBOutlet weak var cameraView: UIImageView! 
var rectangleView : UIView! 
var captureSession : AVCaptureSession? 
var previewLayer : AVCaptureVideoPreviewLayer? 
var rect = CGRect(x: 150, y: 150, width: 50, height: 50) 
var xCoord: Float = 0.0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    //---editing rectangle view--- 
    rectangleView = UIView() 
    rectangleView.layer.borderColor = UIColor(hue: 0.2444, saturation: 1, brightness: 0.96, alpha: 1).cgColor 
    rectangleView.layer.borderWidth = 50; 
    rectangleView.tag = 1 
    self.view.addSubview(rectangleView) 
    //---------------------------- 


    captureSession = AVCaptureSession() 
    captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080 

    let backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    var input = AVCaptureDeviceInput() 
    do{ 
     input = try AVCaptureDeviceInput(device: backCamera) 
    }catch{ 
     print("Error finding back Camera") 
    } 
    var error : NSError? 

    if (error == nil && (captureSession?.canAddInput(input))!) 
    { 
     captureSession?.addInput(input) 

     let dataOutput = AVCaptureVideoDataOutput() 
     dataOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "string buffer delegate")) 

     if (captureSession?.canAddOutput(dataOutput))! 
     { 

      captureSession?.addOutput(dataOutput) 
      previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
      previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect 
      previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
      //    cameraView.layer.addSublayer(previewLayer!) 
      self.view.layer.addSublayer(previewLayer!) 
      self.view.bringSubview(toFront: rectangleView) 
      previewLayer?.frame = self.view.bounds 
      rectangleView.frame = rect 
      captureSession?.startRunning() 

     } 
    } 
} 

ここcaptureOutput関数は次のとおり SETYの方法が変化UIViewクラスの拡張でありますフレームのy座標。助けのための

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 

    let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer!) 
    let x = rectangleView.frame.origin.x 
    let y = rectangleView.frame.origin.y - 1 
    let height = rectangleView.frame.size.height 
    let width = rectangleView.frame.size.width 

    rectangleView.setY(y: y) 

    print(rectangleView.frame.origin.y) 

    //*** Making UIImage out of pixelBuffer **** 
    let ciImage = CIImage(cvPixelBuffer: pixelBuffer!) 
    let pixelBufferWidth = CGFloat(CVPixelBufferGetWidth(pixelBuffer!)) 
    let pixelBufferHeight = CGFloat(CVPixelBufferGetHeight(pixelBuffer!)) 
    let imageRect:CGRect = CGRect(x: 0,y: 0,width: pixelBufferWidth, height: pixelBufferHeight) 
    let ciContext = CIContext.init() 
    let cgimage = ciContext.createCGImage(ciImage, from: imageRect) 
    let image = UIImage(cgImage: cgimage!) 
    //****************************************** 



} 

おかげで、

は、それがUIを操作していますので、あなたは、メインスレッド上でsetY(y:)メソッドを呼び出す必要が

+0

を、あなたを共有することができますコード? –

+0

よろしくお願いします。 – NFarrell

+0

メインスレッドで 'setY(y:)'メソッドを呼び出そうとしましたか? 'DispatchQueue.main.async {self.rectangleView.setY(y:y)}'。 (私はあなたがこのメソッドの外で 'setY'メソッドをテストし、期待どおりに動作することを確認していると仮定しています) –

答えて

0

を-nfarrell:

DispatchQueue.main.async { 
    self.rectangleView.setY(y: y) 
}