2017-01-03 6 views
-3

Also folgte ich diesem Tutorial auf youtube: https://www.youtube.com/watch?v=uUTevJAhL3Q, und ich kann nicht herausfinden, wie man den Rest zu Swift 3 aktualisiert; Ich bin relativ neu in Swift und lerne immer noch, wenn mir jemand helfen könnte, wäre das fantastisch! Ich versuche eine Snapchat-Kameraansicht neu zu erstellen.Veralteter Code von Swift 2 zu Swift 3

import UIKit 
import AVFoundation 

class CameraVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 


    var captureSession : AVCaptureSession? 
    var stillImageOutput : AVCaptureStillImageOutput? 
    var previewLayer : AVCaptureVideoPreviewLayer? 
    @IBOutlet var cameraView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

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


    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     previewLayer?.frame = cameraView.bounds 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(animated) 

     captureSession = AVCaptureSession() 
     captureSession?.sessionPreset = AVCaptureSessionPreset1920x1080 

     var backCamera = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

     var error : NSError? 
     var input = AVCaptureDeviceInput(device: backCamera, error: &error) 

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

      captureSession?.addInput(input) 

      stillImageOutput = AVCaptureStillImageOutput() 
      stillImageOutput?.outputSettings = [AVVideoCodecKey : AVVideoCodecJPEG] 

      if (captureSession?.canAddOutput(stillImageOutput) != nil){ 
       captureSession?.addOutput(stillImageOutput) 

       previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
       previewLayer?.videoGravity = AVLayerVideoGravityResizeAspect 
       previewLayer?.connection.videoOrientation = AVCaptureVideoOrientation.portrait 
       cameraView.layer.addSublayer(previewLayer!) 
       captureSession?.startRunning() 

      } 


     } 


    } 
    @IBOutlet var tempImageView: UIImageView! 


    func didPressTakePhoto(){ 

     if let videoConnection = stillImageOutput?.connection(withMediaType: AVMediaTypeVideo){ 
      videoConnection.videoOrientation = AVCaptureVideoOrientation.portrait 
      stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { 
       (sampleBuffer, error) in 

       if sampleBuffer != nil { 


        var imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
        var dataProvider = CGDataProvider(data: imageData as! CFData) 
        var cgImageRef = CGImage(jpegDataProviderSource: dataProvider, decode: nil, shouldInterpolate: true, intent: kCGRenderingIntentDefault) 

        var image = UIImage(CGImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.Right) 

        self.tempImageView.image = image 
        self.tempImageView.isHidden = false 

       } 


      }) 
     } 


    } 


    var didTakePhoto = Bool() 

    func didPressTakeAnother(){ 
     if didTakePhoto == true{ 
      tempImageView.isHidden = true 
      didTakePhoto = false 

     } 
     else{ 
      captureSession?.startRunning() 
      didTakePhoto = true 
      didPressTakePhoto() 

     } 

    } 

    func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 
     didPressTakeAnother() 
    } 

} 
+2

Kannst du die genauen Fehler posten, die du zeigst und was du probiert hast? Ich bezweifle, dass jemand diesen Code direkt für Sie durchgehen und neu schreiben wird. – Frankie

+0

ist es in Bezug auf var stillImageOutput: AVCaptureStillImageOutput? und wie das den Rest der Eingaben, die das verwenden –

Antwort

1

Swift 3 eingeführt, um die Idee von error handling und die meisten (wenn nicht alle) von Apples Foundation und Core-APIs wurden aktualisiert, so dass statt einen Fehler mit dem inout &error Parameter mit der Methode throws und Fehler zu erfassen.

So Code, den Sie wie folgt verwendet schreiben:

var error : NSError? 
var input = AVCaptureDeviceInput(device: backCamera, error: &error) 

In Swift 3 aktualisiert, um die Fehlerparameter fallen zu lassen, und Sie die neue do, try, catch Syntax:

do { 
    var input = try AVCaptureDeviceInput(device: backCamera) 
    //... input was assigned without an error, you can use in the scope of this statement 

} 
catch { 
    // an error occured attempting `AVCaptureDeviceInput(device: backCamera)` 
    print("an error occured") 
} 

Wenn Sie bevorzugen, die Kurzschriftversionen:

var input = try! AVCaptureDeviceInput(device: backCamera) 
// not safe: app will crash if AVCaptureDeviceInput fails 

var input = try? AVCaptureDeviceInput(device: backCamera) 
// safer: input will be assigned as `nil` if AVCaptureDeviceInput fails 

Wenn Sie das nächste Mal von Swift 2 auf Swift 3 umsteigen, versuchen Sie es mit dem Refactor-Tool von Xcode. Es macht einen ziemlich guten Job, diese Änderungen automatisch für Sie vorzunehmen.

+0

ps: das nächste Mal, wenn Sie eine Frage auf Überlauf, nicht vergessen, den tatsächlichen Fehler, dass Xcode gibt Ihnen z. 'Kann nicht im Initialisierer für den Typ AVCaptureDeviceInput aufgerufen werden ...' weil das hilft, dass Leute Ihnen viel schneller helfen! – MathewS

+0

Vielen Dank! –