2016-06-27 9 views
0

私のUITableViewControllerには、高さがUITextViewの長さに依存する多くのカスタムセルがあります。これは、正確なサイズをheightForRowAtIndexPath()メソッドから返すことができないことを意味します。なぜなら、私はその時点でまだそれを知ることができないからです。また、私はUITextViewを支配制約に@IBOutlet weak varを作成することはできませんとして、ここで私が試してみましたコードだ:Swift:cellForRowAtIndexPathメソッドでUITableViewCellを設定する方法

let cell = tableView.dequeueReusableCellWithIdentifier("BigTextCell", forIndexPath: indexPath) as! BigTextCell 

cell.backgroundColor = UIColor(patternImage: UIImage(named: "icons/background.png")!) 

cell.paragraph.layer.borderColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 1).CGColor 
cell.paragraph.layer.borderWidth = 0.5 
cell.paragraph.editable = false 
cell.title.enabled = false 


switch (indexPath.row) { 
    case 1: 
     cell.title.text = "Chi è:" 
     cell.icon.image = UIImage(named: "icons/field_fish.png") 
     cell.paragraph.text = self.fieldsCollection["life_method"] as! String 
     cell.paragraph.backgroundColor = UIColor(patternImage: UIImage(named: "icons/quadretti.png")!) 

     for constraint in cell.icon.constraints { 
      if (constraint.identifier == "icon_width") { 
      constraint.constant = 64.0 
      break 
      } 
     } 

     for constraint in cell.paragraph.constraints { 
      if (constraint.identifier == "longTextConstraint") { 
      constraint.constant = cell.paragraph.sizeThatFits(CGSize(width: cell.paragraph.frame.width, height: CGFloat.max)).height 
      break 
      } 
     } 
... 

したがって、UITextViewは正しくテキストの長さに応じてサイズが、多くの場合、セルの高さがあります過度に。これをどうすれば解決できますか?あなたのいくつかが示唆したように、私はheightForRowAtIndexPath

if (indexPath.row == 1) { 
     //return 235.0 
     let cell = tableView.dequeueReusableCellWithIdentifier("BigTextCell", forIndexPath: indexPath) as! BigTextCell 
     cell.paragraph.text = self.fieldsCollection["life_method"] as! String 

     for constraint in cell.paragraph.constraints { 
      if (constraint.identifier == "longTextConstraint") { 
       constraint.constant = cell.paragraph.sizeThatFits(CGSize(width: cell.paragraph.frame.width, height: CGFloat.max)).height 
       return constraint.constant+30.0 
       break 
      } 
     } 
} 

シミュレータブロックでこれをしようとした場合 は、あなた

UPDATE ありがとうございます。

答えて

1

heightForRowAtIndexPath()メソッド呼び出しでtableView.rowHeight = UITableViewAutomaticDimensionを設定するか、適切なテキストのセルの高さを計算できます。

+0

ので、私は私が '' heightForRowAtIndexPathにcellForRowAtIndexPath' 'で行う同じ説明を繰り返すなければなりませんか?さらに、私が 'UITableViewAutomaticDimension'を使うと、同じ高さのセルが得られます... –

+0

本当にUITextViewが必要ですか?テキストに合わせてサイズを調整できるUILabelを使用できますか? heightForRowAtIndexPathでは、現在のインデックスパスのテキストを取得し、そのテキストの高さを計算する必要があります([link](http://stackoverflow.com/questions/19128797/calculating-uilabel-text-size)を参照)。 – Sunny

+1

'UITableViewAutomaticDimension'を使うときは、' tableView:estimatedHeightForRowAtIndexPath: 'で意味のある値を返す必要があります。まだ動作しない場合は、制約をチェックする必要があります。テーブルビューで自動ディメンションを使用すると、非常に便利ですが、バグがないわけではありません。古い代替案を使用する準備ができています。 –

0

正確な高さを- tableView:heightForRowAtIndexPath:- tableView:estimatedHeightForRowAtIndexPath:に戻すことができます(正確な高さはここでは必ずしも正確ではありませんが、値が正確ではない場合は視覚的グリッチが発生し、使用しています)。計算に欠けているのは、セルインスタンスだけです。対応するcellForRowAtIndexPathメソッドを呼び出すことによって、または表示しないが計算に使用する静的セルインスタンスを使用して、テーブルビューから取得できます。前者は高速かつ使いやすいものであり、後者はそれ自体の具体的な使用例を有する。何らかの理由で実際のテーブルビューを持たないセルの高さを計算したい場合は、たとえUITableViewUITableViewDataSourceが類似シグネチャとメソッドを有する

注、- cellForRowAtIndexPath - tableView:cellForRowAtIndexPath:それぞれ、それらは異なる機能とテーブルビューの方法は、nilを返す詳細についてはマニュアルを参照することができます。

+0

私はあなたが書いたことを試しましたそれは動作しません。私は 'heightForRowAtIndexPath()'でセルをインスタンス化しようとした後、長さに応じて 'UITextView'の制約を調整し、' return constraint.constant + 30.0'のようなものを返しますが、シミュレータはブロックします。 –

+0

無限再帰の潜在的な原因である 'tableView:heightForRowAtIndexPath'の内部からセルをデキューしないでください.iOSはデキューするたびに' tableView:heightForRowAtIndexPath: 'を呼び出すことがあります。同じデリゲートの他のメソッドに対する、いくつかのデリゲートメソッドの不要な依存関係を避けるのが一般的です。代わりにテーブルビューの 'cellForRowAtIndexPath:'を呼び出すことを試みてください。または、計算にのみ使用するセルクラスの静的インスタンスを手動で初期化します。 –

+0

私は 'cellForRowAtIndexPath'を呼び出すことはできません。なぜなら、常に' indexPath.row'ごとにセルをデキューしています...私は計算のためにカスタムセルを初期化しようとしていますが、 'dequeueReusableCellWithIdentifier'コールでの制約がありません... –

1

あなたviewDidLoad方法でこれを試してみてください:

tableView.rowHeight = UITableViewAutomaticDimension 
    tableView.estimatedRowHeight = 100.0 //Change this to any value 
+0

非常に低いすべての高さのセルを取得するので、うまくいきません...おそらく私の制約は正しくありませんが、わかりませんそれらを修正する場所... –

関連する問題