私は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つの回避策があります。
あなたはデザインパターンを考え直したいかもしれません。一つは、 'cellForRowAt'でセルのサブビューを作成/追加/削除することはお勧めできません。 'GameManagement.setupBoard()'は何をしますか? UIImageView'sを追加/削除する理由は何ですか?そしておそらく他のビュー(あなたの '.subviews.forEach'ループを見て)?たぶんあなたが撮影しているもののいくつかの画像を表示する... – DonMag
私は作成しているゲームのための既存のボードのプレビューを生成しています。私がスナップショットを撮る必要があるのは、各ゲームピースが複数のビューで構成されていることです(ボードをプレビューするたびに複数のゲームピースがあります)。各セルは画面の一部を占めるだけなので、画面あたり数百のビューが表示されてしまい、非常に不安定なスクロールが発生します。スナップショットを取得することで、ビュー数を減らしスムーズにスクロールすることができます。 – SuperCodeBrah