2016-09-11 4 views
0

コードがうまく動作してクラッシュすることもあるので、これは奇妙な問題です。しかし、最近は墜落しているだけです。UIViewの画像キャプチャからのUIImageがクラッシュし続けますか? Swift iOS9

私はuiviewから得ているイメージを持っています。私は以下のキャプチャ関数を使用して画像を取得し、次に画像をプロパティに送り、prepareForSegueを次のビューコントローラに送るようにします。画像を返すときにコードがクラッシュし続けます。私はそれをデバッグし、プロパティが無限から確実に画像を含むようになったのを見ましたが、それをクラッシュさせる時間があるときです。しかし、クラッシュはセグのキャプチャ機能の中にあります。イメージが返されるので(デバッガはそれを示した)、それは異常ですが、キャプチャリターン​​はクラッシュが起きている場所です。

//This seems to be the main problem 
return capturedImage 

をし、ここで返さcapturedImage

Thread1: EXC_BAD_INSTRUCTION (code=EXC_1336_INVOP, subcode=0x0) 

私もこのラインでクラッシュを得ていたが、何とかクラッシュが停止のためのクラッシュログです:クラッシュがで発生します。それがクラッシュ停止したため、私はこの1つのためにクラッシュログを置くことはできませんが、私はなぜ知らないか、それが

view!.layer.renderInContext(UIGraphicsGetCurrentContext()!) 

任意のアイデアを停止する方法?

Btw私はストーリーボードボタンを使用してセグをトリガーします。

class MainController: UIViewController { 

@IBOutlet weak var mainView: UIView! 

var mainPic: UIImage? 


override func viewDidLoad() { 
     super.viewDidLoad() 
} 

//MARK: -Func to convert image in uiview to uiimage 
//get image from UIView, render it for Retina compatibility, then return it as an UIImage 
func captureAndRenderUIImageFromUIView(view:UIView?) -> UIImage { 

    UIGraphicsBeginImageContextWithOptions((view?.bounds.size)!, true, 0.0) 
    view!.drawViewHierarchyInRect(view!.bounds, afterScreenUpdates: true) 

    //I was also getting crashes on this line but they stopped?? 
    view!.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
    let capuredImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    //The return value is where the crash keeps happening 
    return capturedImage 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    self.mainPic = self.captureAndRenderUIImageFromUIView(mainView) 

    if segue.identifier == "toDetailController"{ 

    let detailVC = segue.destinationViewController as! DetailController 
    detailVC.detailPic = self.mainPic! 
    } 
} 

} 

} 

はここではあり

class DetailController: UIViewController { 
@IBOutlet weak var imageView: UIImageView! 

var detailPic: UIImage? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.imageView.image = self.detailPic 
    } 

} 
+0

が推測追いつかないでください。エラーは何ですか?あなたの質問を、クラッシュの正確かつ完全な詳細で更新してください。 – rmaddy

+0

@maddy oh yeahあなたの権利は、今すぐ更新します –

+0

@maddyはそれを更新しましたthanks –

答えて

0

Hiに起こっているのビューです:私はあなたがここにしようとしたのとほぼ同じ方法で物事をやろうとして始めました。ただし、エラーが発生しやすく、不安定です。私は最近、あなたがUIViewメソッドsnapshotViewAfterScreenUpdatesを使用することで多くの手間を省くことができることを発見しました。スナップショットを撮りたいビューでこれを直接呼び出すと、UIImageが返されます。

あなたはで詳細を見ることができます: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/occ/instm/UIView/snapshotViewAfterScreenUpdates

実際に私は、これらの機能の家族(あなたのサイズ変更UIImageViewを与える例えば機能)があるように見えるとして、あまりにもここで何かを学びました。

希望に役立ちます。

EDIT:次のように私のアプリケーションの一つで、私はサブルーチンを介してこれを実装:

func getSnapshot(target: UIView) -> Void { 
      // Clean down 
      if let _ = self.snapshotView where self.snapshotView.isDescendantOfView(self) { 
       self.snapshotView.removeFromSuperview() 
      } 

      self.snapshotView = target.snapshotViewAfterScreenUpdates(true) 
      let snapshotFrame : CGRect = CGRect(origin: recognizer.locationInView(self), size: target.frame.size) 
      self.snapshotView.frame = snapshotFrame 
      self.addSubview(self.snapshotView) 

      self.canMoveSnapshot = true 
     } 
+0

助けてくれてありがとう、私は今すぐ文書を見ています。なぜコードがエラーを起こしやすいと言いましたか?あなたが発見した問題は何でしたか? –

+0

短い答えは、うまく動作しなかったということです(!)。しかし、多くのビューで作業しているときに、正しいCGContextを取得するためにキャプチャしたい部分を分離しようとすると、時間がかかり、エラーが発生する可能性があります。私が提案した関数は、1つのメソッド呼び出しですべてのことを処理します。 – Sparky

+0

あなたが送ったドキュメントリンク上のメソッドを探しました。それはビューオブジェクトを返すようです。どのようにしてビューオブジェクトからイメージオブジェクトに移動するのですか? func snapshotViewAfterScreenUpdates(_ afterUpdates:Bool) - > UIView –

関連する問題