2017-03-17 53 views
3

我製作了可擴展的tableViewCell,當點擊時展開和摺疊,我的單元格中也有兩個標籤(dateLabel & textLabel),但是當我點擊單元格時,我的標籤也隨之移動。我如何使它們變爲靜態,並在點擊時阻止它們移動。當我展開我的TableViewCell時,爲什麼我的標籤會移動,並且爲什麼點擊時會獲得不同的單元格動畫?

這裏是我的類的代碼,有tableView

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

tableView.deselectRow(at: indexPath, animated: true) 
let previousIndexPath = selectedIndexPath 
if indexPath == selectedIndexPath { 
selectedIndexPath = nil 
} else { 
selectedIndexPath = indexPath 
} 

var indexPaths : Array<IndexPath> = [] 
if let previous = previousIndexPath { 
indexPaths += [previous] 
} 
if let current = selectedIndexPath { 
indexPaths += [current] 
} 
if indexPaths.count > 0 { 
tableView.reloadRows(at: indexPaths, with: UITableViewRowAnimation.automatic) 
} 

} 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCellID") as! CustomCell 
    cell.textLabel?.text=list[indexPath.row] 
    cell.dateLabel?.text = time.indices.contains(indexPath.row) ? time[indexPath.row] : "Not Available" 
    print(time.indices.contains(indexPath.row)) 
    return (cell) 
} 
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
    if indexPath == selectedIndexPath { 
     return CustomCell.expandedHeight 
    } else { 
     return CustomCell.defaultHeight 
    } 
} 

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    (cell as! CustomCell).watchFrameChanges() 
} 

override func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    (cell as! CustomCell).ignoreFrameChanges() 
} 


override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 
    for cell in tableView.visibleCells as! [CustomCell] { 
     cell.ignoreFrameChanges() 
    } 
} 

和我CustomCell類:

var isObserving = false; 

class var expandedHeight: CGFloat { get { return 170 } } 
class var defaultHeight: CGFloat { get { return 40 } } 

func checkHeight() { 
    textView.isHidden = (frame.size.height < CustomCell.expandedHeight) 
} 


func watchFrameChanges() { 
    if !isObserving { 
     addObserver(self, forKeyPath: "frame", options: [NSKeyValueObservingOptions.new, NSKeyValueObservingOptions.initial], context: nil) 
     isObserving = true; 
    } 
} 

func ignoreFrameChanges() { 
    if isObserving { 
     removeObserver(self, forKeyPath: "frame") 
     isObserving = false; 
    } 
} 

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { 
    if keyPath == "frame" { 
     checkHeight() 
    } 
} 

我也得到了不同cells..like不同的動畫,我得到幻燈片第一個單元格的動畫和其餘全部淡入淡出

+0

你能提供關於如何佈置'cell.textLabel'和'cell.dataLabel'的信息/代碼嗎?你正在使用代碼來佈局? (似乎不)或故事板與自動佈局約束? –

+0

@PangHoMing我沒有使用任何限制..在任何標籤。 'dateLabel'在滑雪板上,但'textLabel'被編程調用。 –

回答

0

@PangHoMing我沒有使用任何限制..在任何一個標籤。 dateLabel在滑水板上,但textLabel以編程方式稱爲 。

所以我認爲這就是問題所在。例如,默認的textLabel隨單元總是佈置在水平中心。對於dateLabel的情況,您需要在故事板中設置約束條件。

否則iOS Autolayout會以'他'的方式佈置視圖。 https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/

快速建議:

避免使用cell.textLabel自帶的默認單元格 您可以在您的自定義單元格類實現layoutSubView編程佈局單元格。但是如果你不習慣使用代碼來佈局UI,那麼最好的方法就是使用Storyboard。

利用這些一看就會幫助:

https://www.youtube.com/watch?v=EVJiprvRLoo

https://www.ralfebert.de/tutorials/ios-swift-uitableviewcontroller/custom-cells/

+0

我已更新我的問題,請看看。 –

0

其實這是issue.If你希望你的標籤是靜態的,然後你的佈局,你將不得不根據給約束你只需要這個。就像你想讓標籤處於相同的位置,即使按下「展開」按鈕,然後給你的標籤約束 - 引導頂部的高度寬度。這意味着它和框架將是相同的throghout。

+0

是的我設法做到這一點,但我有關'UITableViewRowAnimation'的其他問題呢?我得到2個動畫 –

+0

所以你默認得到兩個動畫? –

+0

是的,當我使用'UITableViewRowAnimation.default'我的第一個單元格有一個淡入淡出的動畫,而我所有的其他單元格有幻燈片動畫。 –

相關問題