亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于視圖的NSTableView具有動態高度的行

基于視圖的NSTableView具有動態高度的行

慕容708150 2019-11-22 12:58:09
我有一個基于視圖的應用程序NSTableView。在此表視圖中,我有一些行,這些行的單元格的內容由NSTextField啟用了自動換行的多行組成。根據的文本內容,NSTextField顯示單元格所需的行大小會有所不同。我知道我可以實現該NSTableViewDelegate方法- tableView:heightOfRow:返回高度,但是高度將基于上的自動換行來確定NSTextField。的自動換行NSTextField類似地基于NSTextFieldis的寬度……由的寬度決定NSTableView。太…我想我的問題是……什么是好的設計模式?似乎我嘗試的所有操作都變得混亂不堪。由于TableView需要了解單元格的高度才能對其進行布局...并且NSTextField需要了解其布局來確定自動換行...并且單元格需要了解自動換行來確定其高度...這是一個圓形的混亂局面...這讓我發瘋。有什么建議嗎?如果重要的話,最終結果也將具有可編輯的內容NSTextFields,可以調整其大小以適應其中的文本。我已經在視圖級別進行此操作,但是tableview尚未調整單元格的高度。我認為一旦解決了高度問題,我將使用- noteHeightOfRowsWithIndexesChanged方法通知表格視圖高度已更改……但是仍然要向委托人詢問高度……因此,我很困惑。提前致謝!
查看完整描述

3 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

這是雞和雞蛋的問題。表格需要知道行高,因為它確定了給定視圖的位置。但是,您希望視圖已經存在,因此可以使用它來計算行高。那么,哪個先出現?


答案是保留額外的NSTableCellView(或用作“單元格視圖”的任何視圖)周圍,僅用于測量視圖的高度。在tableView:heightOfRow:委托方法中,訪問模型的“行”并設置objectValueon NSTableCellView。然后將視圖的寬度設置為表格的寬度,然后(無論您要執行什么操作)找出該視圖所需的高度。返回該值。


請勿noteHeightOfRowsWithIndexesChanged:在委托方法tableView:heightOfRow:或viewForTableColumn:row:!中調用 那是不好的,并且會引起大麻煩。


要動態更新高度,那么您應該做的是響應文本更改(通過目標/動作)并重新計算該視圖的計算高度?,F在,請勿動態更改NSTableCellView的高度(或任何用作“單元格視圖”的視圖)。該表必須控制該視圖的框架,如果嘗試設置該視圖,您將與之抗爭。相反,在計算高度的文本字段的目標/操作中,調用 noteHeightOfRowsWithIndexesChanged:,這將使表調整該行的大小。假設您已經在子視圖(即的子視圖NSTableCellView)上設置了自動調整大小的蒙版設置,那么應該可以調整大??!如果不是,請首先對子視圖的調整大小蒙版進行操作,以使行高度可變的東西正確無誤。


不要忘記noteHeightOfRowsWithIndexesChanged:默認設置動畫。要使其不動畫,請執行以下操作:


[NSAnimationContext beginGrouping];

[[NSAnimationContext currentContext] setDuration:0];

[tableView noteHeightOfRowsWithIndexesChanged:indexSet];

[NSAnimationContext endGrouping];

PS:我對Apple Dev論壇上發布的問題的回答要多于堆棧溢出。


PSS:我寫了基于視圖的NSTableView


查看完整回答
反對 回復 2019-11-22
?
慕妹3242003

TA貢獻1824條經驗 獲得超6個贊

根據Corbin的回答(順便說一句,感謝您對此發表一些看法):


Swift 3,基于視圖的NSTableView,帶有適用于macOS 10.11(及更高版本)的自動布局


我的設置:我有一個NSTableCellView使用自動版式布局的布局。它包含(除其他元素外)多行NSTextField,最多可包含2行。因此,整個單元格視圖的高度取決于此文本字段的高度。


我更新告訴表格視圖兩次來更新高度:


1)當表格視圖調整大小時:


func tableViewColumnDidResize(_ notification: Notification) {

        let allIndexes = IndexSet(integersIn: 0..<tableView.numberOfRows)

        tableView.noteHeightOfRows(withIndexesChanged: allIndexes)

}

2)當數據模型對象更改時:


tableView.noteHeightOfRows(withIndexesChanged: changedIndexes)

這將導致表格視圖向其委托要求新的行高。


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


    // Get data object for this row

    let entity = dataChangesController.entities[row]


    // Receive the appropriate cell identifier for your model object

    let cellViewIdentifier = tableCellViewIdentifier(for: entity)


    // We use an implicitly unwrapped optional to crash if we can't create a new cell view

    var cellView: NSTableCellView!


    // Check if we already have a cell view for this identifier

    if let savedView = savedTableCellViews[cellViewIdentifier] {

        cellView = savedView

    }

    // If not, create and cache one

    else if let view = tableView.make(withIdentifier: cellViewIdentifier, owner: nil) as? NSTableCellView {

        savedTableCellViews[cellViewIdentifier] = view

        cellView = view

    }


    // Set data object

    if let entityHandler = cellView as? DataEntityHandler {

        entityHandler.update(with: entity)

    }


    // Layout

    cellView.bounds.size.width = tableView.bounds.size.width

    cellView.needsLayout = true

    cellView.layoutSubtreeIfNeeded()


    let height = cellView.fittingSize.height


    // Make sure we return at least the table view height

    return height > tableView.rowHeight ? height : tableView.rowHeight

}

首先,我們需要獲取模型對象的行(entity)和適當的單元格視圖標識符。然后,我們檢查是否已經為此標識符創建了視圖。為此,我們必須維護一個列表,其中包含每個標識符的單元格視圖:


// We need to keep one cell view (per identifier) around

fileprivate var savedTableCellViews = [String : NSTableCellView]()

如果沒有保存,則需要創建(并緩存)一個新的。我們使用模型對象更新單元格視圖,并告訴它根據當前表視圖寬度重新布局所有內容。fittingSize然后可以將該高度用作新的高度。


查看完整回答
反對 回復 2019-11-22
  • 3 回答
  • 0 關注
  • 1154 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號