2017-10-12 32 views
1

我試圖用動畫展開UITextView,當用戶點擊閱讀更多按鈕時,它會在下面展開。在UITableViewCell中展開UITextView高度(閱讀更多效果)

enter image description here

我已經嘗試了很多的方法,並提出了幾乎工作液:

func readMore() { 
    self.tableView.beginUpdates() 
    cell.descTextViewHeightConstraint.constant = cell.descTextView.expectedHeight() 
    self.tableView.endUpdates() 
} 

的UITextView +身高

extension UITextView { 
    func expectedHeight() -> CGFloat { 
     let textView: UITextView = UITextView(frame: CGRect(x: 0, y: 0, width: self.frame.size.width, height: CGFloat.greatestFiniteMagnitude)) 
     textView.font = self.font 
     textView.text = self.text 
     textView.sizeToFit() 
     return textView.frame.height 
    } 
} 

此解決方案,但是有一個sideeffect - 當動畫結束時,隱藏UITableViewCell中的一些元素(標題標籤)。

我也試圖在動畫完成時調用tableView.reloadData(),它可以工作,但有時也有副作用。

+1

幾乎每天都會問到這個問題,這就是爲什麼我創建了這個示例項目https://github.com/bavarskis/ExpandingTableViewCell.git看看它,它非常簡單。 –

+0

我在我的代碼中發現了一個錯誤,導致我提到的一個副作用(點擊時按鈕讀取更多並未隱藏)。我在cellForRow函數中以編程方式創建了read more按鈕。問題在於,當我不止一次滾動到該單元格時,該按鈕每次都會創建,並且只有最後創建的那個被隱藏。 –

回答

1

爲什麼不使用numberOfLines屬性「玩」?

對於一個項目,我做了類似這樣的事情(還有一個UIImage箭頭旋轉了......)。一切都是一個自定義單元格類中:

func setExpanded(_ isExpanded: Bool) { 
    if isExpanded { 
     lblFullDescription.numberOfLines = 0 
     UIView.animate(withDuration: Constants.NavigationBar.AnimationTime, animations: { [weak self] in 
      self?.imgArrow.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) 
     }) 

    } else { 
     lblFullDescription.numberOfLines = 2 
     UIView.animate(withDuration: Constants.NavigationBar.AnimationTime, animations: { [weak self] in 
      self?.imgArrow.transform = CGAffineTransform(rotationAngle: CGFloat(0)) 
     }) 
    } 
} 

而且在ViewController中添加此持有的的UITableView:

tableView.rowHeight = UITableViewAutomaticDimension 
tableView.estimatedRowHeight = 42 
+0

我試過這種方法。它的工作,但問題是,它從底部「動畫」。當我將行數設置爲2時,我可以看到前兩行的內容,這很好。但是,當我將行數設置爲0時,我只能看到標籤中最後兩行的內容(不是前兩行),而在動畫期間,內容與底部相關,所以我將第一行競爭對手最後顯示。 –

0

可以對細胞的回調和更新它的約束

func updateTableViewUIfor(indexPath: IndexPath) { 
    self.tableView.beginUpdates() 
    theCell.updateToExpanded() //get the cell and update it's constraints 
    self.tableView.setNeedsDisplay() 
    self.tableView.endUpdates() 
} 

並且您使用

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
//... return required height 
} 
+0

tableView.setNeedsDisplay沒有幫助。動畫工作後,只有tableView.reloadData()。 –

0

我有一些問題與iOS 11和自我大小/可調整大小的單元格。我不知道eactyl對你來說有什麼奇怪的行爲,但在我的情況下,我確實將tableView estimatedRowHeight設置爲一個大於我的最大單元高度的值,並解決了它。

+0

我有不同的錯誤,我在問題評論中描述了它。但是,感謝您的意見。可能幫助別人。 –