2016-07-19 4 views
0

私はiPad上の自分のアプリから正方形の画像しか撮らないようにコードを書こうとしています。ここで私はObjective-CからSwiftに翻訳した解決策を見つけましたが、コードを使って写真を撮った後、iPadを90度回転させない限り「写真を使用」ボタンと「再撮影」ボタンは反応しません。風景モードからボタンを押してください。これはもちろん望ましくないことです。私のコードを修正する方法に関するヒントは素晴らしいだろう。画像を四角形にプログラムクロップするための解決策に問題がある

@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) 
} 

答えて

0

私はこの問題を解決

picker.cameraOverlayView = overlayIV 

持つために必要な私のコードの代わりに、

picker.cameraOverlayView?.addSubview(overlayIV) 

に問題があることを発見しました。

0

あなたはこのラインで全体のピッカーの上にオーバーレイを置く:f以来

let overlayIV = UIImageView(frame: f) 

は基本的にピッカーの境界です。ビューがこれらの範囲を保持し、サイズを変更しない(オートレイアウトを使用していない)ため、ボタンがその範囲外にあることは幸いです。

だから、あなたとナビゲーションバーのためのFの高さを調整するのと同じ方法で:

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

あなたは(あなたが上ではない)のボタンを調整する必要があるとしています。 overlayIVに背景色を与えて、デバッグ中にそれを見ることができます。

また、あなたは、ビュー階層のデバッガを使用することができます:あなたが回転したときに、それ自体のサイズを変更するようhttps://developer.apple.com/library/ios/documentation/ToolsLanguages/Conceptual/Xcode_Overview/ExaminingtheViewHierarchy.html

は最後に、いくつかのレイアウト制約の設定を検討します。

+0

"f.size.height - = picker.navigationBar.bounds.size.height"という行はこれを修正することになっています。何らかの理由でオーバーレイがまだボタンと少し重なり合っているように見えるので、 "f.size.height - = 2 * picker.navigationBar.bounds.size.height"でオーバーレイを背景色に塗りつぶしました。もちろん、「再撮影」ボタンと「写真を使う」ボタンは、オーバーレイで覆われていませんが、まだ機能しません。あなたが言っていることは理にかなっていますが、意味がありません。オーバーレイがボタンをカバーしていないと、ボタンの使用がブロックされるのはなぜですか? –

+0

ビューの親にも色を付ける –

+0

Xcodeでビューデバッガを使用して、何が起こっているのかを知ることができます:https://developer.apple.com/library/ios/documentation/ToolsLanguages/Conceptual/Xcode_Overview/ExviewingViewHierarchy.html –

関連する問題