2016-09-22 4 views
2

EDIT:リンクされた返信で質問に答えられませんでした。私はまだこれに固執しています...Swift/CocoaのNSTableViewの動的行の高さ

私はチャットメッセージのために使用するテーブルを持っています。各メッセージは、テキストを含む可変サイズのボックスです。メッセージボックスのサイズに応じて、テーブルの行の高さを動的に変更する必要があります。

IBのサイズスタイルを「自動」にすると、すべての行が小さな高さになります。 iOSにはテーブルを自動的に拡大するUITableViewAutomaticDimensionがありますが、NSTableViewのようなものは見つかりません。 「

func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat 
{ 
     return 50 // ???? 
} 

と私は(上記のセット高さ50への私のすべての行)を使用して、行の高さを設定することが、私はドン:

私が知っているには、次の関数を作成するためのオプションです私のボックス内のテキストのサイズに依存する方法を知っている。これを効率的に行うにはどうすればよいですか?

+0

あなたの返信をありがとう!私の答えは、コーネルのポストに関するサンカスの精緻化の中にある。しかし、どちらもObjective-Cにあり、私はSwiftにそれらをどのように翻訳するのか苦労しています。 Swift版をここに回答として投稿する可能性はありますか? – SuddenMoustache

+0

また、ウィンドウのサイズが変更されたとき、またはテーブルが再描画されたときだけ、Corbinの答えが行のサイズを変更しますか?後者は問題があります。なぜならユーザーがウィンドウを水平に縮小すると、メッセージは予想どおりに背が高くなり、薄くなるからです。 – SuddenMoustache

答えて

1

ここでは、コード内でNSTextfieldを設定する一つの解決策

まずです。これは、それが実際にheightOfRow機能

func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat { 

    let item = yourArray[row] 
    let fakefield.stringValue = item 
    // exactly how you get the text out of your data array depends on how you set it up 

    let yourHeight = fakefield.cell!.cellSizeForBounds(NSMakeRect(CGFloat(0.0), CGFloat(0.0), yourWidth, CGFloat(FLT_MAX))).height 
    // yourWidth = the width of your cell as CGFloat. 

    return yourHeight 
} 

詳細およびNSTextfield拡張に続いて

var fakefield = NSTextField() 
// Set the fontsize etc to be what you will use in the table 

を描かれることはありませんように「仮想」フィールドである Hereを見つけることができます。この回答はSwift 2.3にあることに注意してください(まだ3に飛び込まなかった)