2017-05-21 5 views
0

私はUIViewのスナップショットを取得するために以下の関数を使用していますが、UITableViewCellの中で使用しています。ここでUITableViewCellで空白のイメージを返すUIGraphicsGetImageFromCurrentImageContext()

static func pictureTaker(_ rawView: UIView) -> UIImageView { 
     UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, false, 0) 
     rawView.drawHierarchy(in: rawView.bounds, afterScreenUpdates: true) 
     let screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
     let viewImage = UIImageView(image: screenshot) 
     UIGraphicsEndImageContext(); 
     viewImage.frame = rawView.frame 
     return viewImage 
    } 

は私がのUITableViewCellを移入するために使用している機能のトリムダウンバージョンです。上記tableView機能で

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = gamesHolder.dequeueReusableCell(withIdentifier: textCellIdentifier, for: indexPath) as! StandardGameCell 
     let row = indexPath.row 

     let boardPreviewTemplate = UIView(frame: CGRect(x: 0, y: 0, width: cell.previewBoard.frame.width, height: cell.previewBoard.frame.height)) 
     GameManagement.setupBoard(boardPreviewTemplate, boardItems: gamesArray[row].board) 

     let gamePicture = PageManagement.pictureTaker(boardPreviewTemplate) 
     gamePicture.frame = CGRect(x: 0, y: 0, width: gamePicture.frame.width, height: gamePicture.frame.height) 

     //Removing preview board items and replacing with picture 
     cell.previewBoard.subviews.forEach({ $0.removeFromSuperview() }) 
     cell.previewBoard.addSubview(gamePicture) 

     return cell 
    } 

、私はプログラム的cell.previewBoardを複製するための新しいビューを作成していますが、私はまた、直接cell.previewBoardをスナップショットしようと、それはどちらか動作しませんでした。私は問題がUITableViewCellの読み込みのタイミングと関係があると思います。

私はまた、関数が画像を返していることを100%肯定していますが(空白の場合)、それは私が意図しているところです。 UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, false, 0)UIGraphicsBeginImageContextWithOptions(rawView.bounds.size, true, 0)に変更すると、返された画像は完全に黒く表示されます。

最後に、boardPreviewPicture.snapshotView(afterScreenUpdates: true)が画像を返すことを発見しましたが、それは非常に遅いUITableViewをスクロールしました。代わりにsnapshotView()を使用できるもう1つの回避策があります。

+0

あなたはデザインパターンを考え直したいかもしれません。一つは、 'cellForRowAt'でセルのサブビューを作成/追加/削除することはお勧めできません。 'GameManagement.setupBoard()'は何をしますか? UIImageView'sを追加/削除する理由は何ですか?そしておそらく他のビュー(あなたの '.subviews.forEach'ループを見て)?たぶんあなたが撮影しているもののいくつかの画像を表示する... – DonMag

+0

私は作成しているゲームのための既存のボードのプレビューを生成しています。私がスナップショットを撮る必要があるのは、各ゲームピースが複数のビューで構成されていることです(ボードをプレビューするたびに複数のゲームピースがあります)。各セルは画面の一部を占めるだけなので、画面あたり数百のビューが表示されてしまい、非常に不安定なスクロールが発生します。スナップショットを取得することで、ビュー数を減らしスムーズにスクロールすることができます。 – SuperCodeBrah

答えて

0

同じ問題が発生しました。私が気づいたのは、UIGraphicsBeginImageContextWithOptionstableView(_:cellForRowAt:)の中で呼び出された場合、UIGraphicsGetImageFromCurrentImageContext()の結果は空白です。ドキュメントに記載されていることに注意してください。UIGraphicsGetImageFromCurrentImageContext

この関数は、アプリケーションの任意のスレッドから呼び出すことができます。

しかし、私が発見した解決策は、それをメインスレッドの内側で呼び出すことです。あなたの場合、おそらくあなたは次のようなことをすることができます:

DispatchQueue.main.async { 
    let gamePicture = PageManagement.pictureTaker(boardPreviewTemplate) 
    gamePicture.frame = CGRect(x: 0, y: 0, width: gamePicture.frame.width, height: gamePicture.frame.height) 

    //Removing preview board items and replacing with picture 
    cell.previewBoard.subviews.forEach({ $0.removeFromSuperview() }) 
    cell.previewBoard.addSubview(gamePicture) 
} 
関連する問題