2017-04-15 5 views
0

私のSwiftアプリでは、私はUITableViewに4つの静的なセルを含んでいて、それから異なる量の動的セルを持っています。私はスタティックセルのスクリーンショットのみを撮りたいです。SwiftのUITableViewで選択した行のスクリーンショットを取得してUIImageとして保存するにはどうすればよいですか?

私は次の拡張が見つかりました:それはこの質問How to render a whole UITableView as an UIImage in iOS?

から来ているしかし、問題は、私が変更にもかかわらず、である

extension UITableView { 
    var capturedImage : UIImage { 
     UIGraphicsBeginImageContext(contentSize); 
     scrollToRow(at: NSIndexPath(row: 0, section: 0) as IndexPath, at:  UITableViewScrollPosition.top, animated: false) 
     layer.render(in: UIGraphicsGetCurrentContext()!) 
     let row = numberOfRows(inSection: 0) 
     let numberofRowthatShowinscreen = 4 
     let scrollCount = row/numberofRowthatShowinscreen 

     for i in 0 ..< scrollCount { 
      scrollToRow(at: NSIndexPath(row: (i+1)*numberofRowthatShowinscreen, section: 0) as  IndexPath, at: UITableViewScrollPosition.top, animated: false) 
      layer.render(in: UIGraphicsGetCurrentContext()!) 
     } 

     let image:UIImage = UIGraphicsGetImageFromCurrentImageContext()! 
     UIGraphicsEndImageContext(); 
     return image; 
    } 
} 

を:

let numberofRowthatShowinscreen = 4 

に:

let numberofRowthatShowinscreen = 3 

それでも、それはUITableView全体のスクリーンショットを取る。最初の4行だけに制限する方法はありますか?

+0

キャプチャされたImageImageを呼び出す前に、 'yourDataSource.prefix(4)'を返すテーブルビューのデータソース配列を制御するのはなぜですか? –

答えて

1

サンプルコードでは、イメージビューでテーブルビューのレイヤーをレンダリングしています。それは常にテーブルビュー全体をスナップショットします。コメント作成者の助言を受けて、スナップショットを作成する前にテーブルビューのセルを調整することができます。または、レンダリングするセルのレイヤーをスナップショットすることもできます。たとえば、次のように

extension UITableView 
{ 
    func snapshotRows(at indexPaths: Set<IndexPath>) -> UIImage? 
    { 
     guard !indexPaths.isEmpty else { return nil } 
     var rect = self.rectForRow(at: indexPaths.first!) 
     for indexPath in indexPaths 
     { 
      let cellRect = self.rectForRow(at: indexPath) 
      rect = rect.union(cellRect) 
     } 

     UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0) 
     guard let context = UIGraphicsGetCurrentContext() else { return nil } 
     for indexPath in indexPaths 
     { 
      let cell = self.cellForRow(at: indexPath) 
      cell?.layer.bounds.origin.y = self.rectForRow(at: indexPath).origin.y - rect.minY 
      cell?.layer.render(in: context) 
      cell?.layer.bounds.origin.y = 0 
     } 

     let image = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return image 
    } 
} 

使用法:

let image = tableView.snapshotRows(at: Set([IndexPath(row: 0, section: 0), IndexPath(row: 0, section: 1)])) 

する唯一のスナップショット特定の細胞。もう1つの記事の答えは、これは、セルが再利用されている可視のセルに対してのみ機能すると言います。

関連する問題