2016-07-18 5 views
0

画像が幅でimageViewを塗りつぶし、画像が縦横比を維持するように動的にセルの高さを変更したい。UITableViewAutomaticDimensionを使用して画像のtableViewCellの高さを動的に変更する

UITableViewAutomaticDimensionを使用してこれを実行しようとしています。オンラインで入手できるチュートリアルに基づいて、これは簡単な作業であるようでした。しかし、私の場合、セルの高さはこの作業を行うために調整されません。画像がアスペクト比で塗りつぶされ、幅の空き領域が多く空いているか、または幅が塗りつぶされていますが、画像の一部が垂直にクリップされます。私は、セルのビューに対して先行、後続、上、下の制約があることを確認しました。また、tableView.rowHeight = UITableViewAutomaticDimensionもあり、table.estimatedRowHeightはviewDidLoadに設定されています。私はこのリンクでプロジェクトをアップロードしました。誰かが私がここで行方不明になる可能性があることをお勧めしますか?あなたがのUITableViewControllerのための次のメソッドを実装必要

Link to GitHub

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 


@IBOutlet weak var picTableView: UITableView! 

let reuseidentifier = "dynamicCellTableViewCell" 
let images = [UIImage(named: "feedImage1"), UIImage(named: "feedImage2"), UIImage(named: "feedImage3")] 

override func viewDidLoad() { 
    super.viewDidLoad() 

picTableView.rowHeight = UITableViewAutomaticDimension 
picTableView.estimatedRowHeight = 1000 
} 

// MARK: Table View Data Source 

func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return images.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseidentifier, forIndexPath: indexPath) as! DynamicCellTableViewCell 

    cell.displayImageView.image = images[indexPath.row] 

    return cell 
} 



} 
+0

あなたのケースでは、UITableViewAutomaticDimensionと一緒に行く必要がありますか?私はそれが他のソリューションと大丈夫ですか? – sourav

+0

お返事ありがとうございます。はい、私はそのようなアプリケーションのために設計されているように見えるUITableViewAutomaticDimensionを実装しようとしています。私はこのチュートリアルのhttps://www.raywenderlich.com/129059/self-sizing-table-view-cellsに従おうとしましたが、うまく動作しないようです。これで問題が解決しない場合、私はこのプラットフォーム上にすでに存在する他のソリューションを実装しようとします。 – Neeraj

答えて

2

私は解決策を考え出しました。 UIImageViewは、UITableViewAutomaticDimensionと一緒に使用すると、UIImageの実際の幅と高さだけをサイズとして検索します。したがって、UIImageViewは、UIImageの元の高さに対応するように高さを調整し、レイアウトの幅に合わせて拡大/縮小された幅(aspectFit)を調整しません。

トリックは、最初に、画像の幅と高さをセル内で必要な幅と高さに合わせて変更することです。残りの作業はUITableViewAutomaticDimensionによって行われます。以下は、現在動作する更新されたcellForRowAtIndex関数です。入力いただきありがとうございます。

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier(reuseidentifier, forIndexPath: indexPath) as! DynamicCellTableViewCell 

    let image = images[indexPath.row]! 
    let newWidth = cell.displayImageView.frame.width 
    let scale = newWidth/image.size.width 
    let newHeight = image.size.height * scale 
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight)) 
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight)) 
    let newImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    cell.displayImageView.image = newImage 

    return cell 
} 
0

:メソッド内

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 1000.0; 
} 

を、あなたは、各セルを持つことになりますどのような寸法を知っている必要があります。各セルの高さを事前に知っておく必要があります。

たとえば、CGFloatの配列を作成すると、高さに各行が保存され、高さが変更された場合は配列内のこの位置を更新してtableView.reloadData()を実行できます。

var arrayHeight:CGFloat? 
//Now fill array with height of each cell 

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return arrayHeight[indexPath.row]; 
} 
+0

ありがとうJuan。私は自分自身の各セルの正確な高さを提供する必要がある場合は、どのようなUITableViewAutomaticDimensionの使用ですか? – Neeraj

0

cell.updateConstraintsIfNeeded()

cell.setNeedsUpdateConstraints()

がcellForRowAtIndexPathデリゲートメソッド

に次の2行を追加していることを確認し、上、下、右、左、ストーリーボードに制約が設定されています

+0

ありがとうございます。私もこれを試したが、それは助けにはならない。私は4つの必要な制約があります。私が作っている他の愚かな間違いを見つけることができるように、私が使っているプロジェクトはここにあります。https://github.com/Neeraj3pathi/SimpleDrawing/issues/2 – Neeraj

+0

ファイルにいくつかの変更を加えました。次のリンクhttp://github.com/Neeraj3pathi/SimpleDrawing/issues/2にzipファイルをアップロードしました。 – Aravi

+0

を確認してくださいArvind、あなたのプロジェクトをダウンロードしてチェックしました。追加したイメージが大きいほど、そのセルの高さはイメージの高さになります。しかし、それはAutoLayout制約に従ってイメージをフィットさせ、そのセルの上部と下部に大きなスペースを空にします。あなたはその問題に直面しませんでしたか? – Neeraj

関連する問題