2016-07-19 6 views
0

Ich versuche, Code zu schreiben, damit die Kamera nur quadratische Bilder von meiner App auf einem iPad macht. Ich habe hier eine Lösung gefunden, die ich von Objective-C nach Swift übersetzt habe, aber nachdem ich ein Bild mit dem Code gemacht habe, reagieren die "Use Photo" - und "Reake" -Buttons nicht auf Berührung, es sei denn, ich drehe das iPad um 90 Grad Drücke den Knopf im Querformat. Dies ist natürlich ziemlich unerwünscht. Irgendwelche Hinweise, wie ich meinen Code reparieren könnte, wären fantastisch.Probleme mit der Lösung zum programmgesteuerten Beschneiden eines Bildes auf ein Quadrat

@IBAction func takePicture(sender: UIButton) 
{ 
    let alertController = UIAlertController(title: nil, message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) 
    let takePictureAction = UIAlertAction(title: "Take Picture", style: UIAlertActionStyle.Default) 
    { (alertAction: UIAlertAction!) -> Void in 
     let picker = UIImagePickerController() 
     picker.delegate = self 
     picker.sourceType = .Camera 
     var f: CGRect 
     f = picker.view.bounds 
     //f.size.width -= picker.navigationBar.bounds.size.width 
     f.size.height -= picker.navigationBar.bounds.size.height 
     var barHeight: CGFloat 
     barHeight = (f.size.height - f.size.width)/2 
     UIGraphicsBeginImageContext(f.size) 
     var edgeColor: UIColor 
     edgeColor = UIColor(white: 0, alpha: 0.5) 
     edgeColor.set() 
     UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, barHeight), CGBlendMode.Normal) 
     UIRectFillUsingBlendMode(CGRectMake(0, f.size.height - barHeight, f.size.width, barHeight), CGBlendMode.Normal) 
     var overlayImage: UIImage 
     overlayImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     let overlayIV = UIImageView(frame: f) 
     overlayIV.image = overlayImage 
     picker.cameraOverlayView?.addSubview(overlayIV) 
     self.presentViewController(picker, animated: true, completion: nil) 
    } 

    let chooseExistingPicture = UIAlertAction(title: "Use Existing", style: UIAlertActionStyle.Default) {(alertAction: UIAlertAction!) -> Void in 

     let picker = UIImagePickerController() 
     picker.delegate = self 
     picker.sourceType = .PhotoLibrary 
     self.presentViewController(picker, animated: true, completion: nil) 
    } 
    alertController.addAction(takePictureAction) 
    alertController.addAction(chooseExistingPicture) 
    alertController.view.tintColor = UIColor.blackColor() 
    presentViewController(alertController, animated: true, completion: nil) 
    let presentationController = alertController.popoverPresentationController 
    presentationController?.sourceView = self.view 
    presentationController?.sourceRect = CGRectMake(330, 210, 330, 210) 
} 
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 
{ 

    var image = info[UIImagePickerControllerOriginalImage] 

    let imageSize = image?.size 
    let width = Double((imageSize?.width)!) 
    let height = Double((imageSize?.height)!) 
    if width != height { 
     let newDimension = min(width, height) 
     let widthOffset = (width - newDimension)/2 
     let heightOffset = (height - newDimension)/2 
     UIGraphicsBeginImageContextWithOptions(CGSizeMake(CGFloat(newDimension), CGFloat(newDimension)), false, 0.0) 
     image?.drawAtPoint(CGPointMake(CGFloat(-widthOffset), CGFloat(-heightOffset))) 
     image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
    } 
    CustomPicture.image = image as? UIImage; 
    dismissViewControllerAnimated(true, completion: nil) 
} 

Antwort

0

fand ich das Problem mit meinem Code statt

picker.cameraOverlayView?.addSubview(overlayIV) 

I

picker.cameraOverlayView = overlayIV 

Dies löst das Problem zu haben, benötigt.

0

Sie legen ein Overlay auf dem gesamten Picker mit dieser Zeile:

let overlayIV = UIImageView(frame: f) 

seit f ist im Grunde die Picker Grenzen. Der Grund, warum das Drehen "behebt", ist, weil die Ansicht diese Grenzen beibehält und die Größe nicht ändert (Sie haben kein automatisches Layout verwendet), und Sie haben nur Glück, dass die Schaltflächen außerhalb dieser Grenzen liegen.

Also, auf die gleiche Art und Weise Sie mit f Höhe für die Navigationsleiste angepasst:

f.size.height -= picker.navigationBar.bounds.size.height 

Sie werden für die Tasten einstellen müssen (so sind Sie nicht an der Spitze). Es könnte eine gute Idee sein, OverlayIV eine Hintergrundfarbe zu geben, damit Sie es während des Debuggens sehen können.

Auch könnten Sie die Ansicht Hierarchie Debugger verwenden: https://developer.apple.com/library/ios/documentation/ToolsLanguages/Conceptual/Xcode_Overview/ExaminingtheViewHierarchy.html

Schließlich betrachten einige Layoutbeschränkungen einrichten, so dass er sich ändert die Größe, wenn Sie drehen.

+0

Die Zeile "f.size.height - = picker.navigationBar.bounds.size.height" soll das beheben. Da das Overlay aus irgendeinem Grund die Buttons immer noch etwas überlappen ließ, habe ich es mit "f.größe.height - = 2 * picker.navigationBar.bounds.size.height" versucht und den Overlay-Hintergrund blau eingefärbt. Sicher, die Schaltflächen "Wiederholen" und "Foto verwenden" sind nicht durch das Overlay abgedeckt, funktionieren aber immer noch nicht. Es ergibt jedoch keinen Sinn, was du sagst, macht Sinn. Warum blockiert das Overlay die Verwendung der Schaltfläche, wenn sie die Schaltflächen nicht abdeckt? –

+0

Färben Sie auch das übergeordnete Element Ihrer Ansicht –

+0

Sie können den Ansicht-Debugger in Xcode verwenden, um herauszufinden, was passiert: https://developer.apple.com/library/ios/documentation/ToolsLanguages/Conceptual/Xcode_Overview/ExaminingtheViewHierarchy.html –