1. 程式人生 > >Swift之動態適配UITableView的cell高度

Swift之動態適配UITableView的cell高度

  • 首先在Xib中拖一個UITableView,讓其充滿整個檢視控制器,並遵守實現UITableViewDelegate,UITableViewDataSource協議;
  • 其次,新建一個繼承於UItableViewCell的自定義表格單元格的類,在xib中拖拽一個UILabel,新增好相應的約束,讓其居中顯示,並將Label的numberOfLines置為0(注意:這裡需要設定Lable的寬度,我設定得為320);
@IBOutlet weak var myTableView: UITableView!

    let identifier:String = "myTableViewCellIdentifier"

    let textArray:NSArray = [
"關雎\n關關雎鳩,在河之洲。\n窈窕淑女,君子好逑。\n參差荇菜,左右流之。\n窈窕淑女,寤寐求之。\n求之不得,寤寐思服。\n悠哉悠哉,輾轉反側。\n參差荇菜,左右采之。\n窈窕淑女,琴瑟友之。\n參差荇菜,左右芼之。\n窈窕淑女,鐘鼓樂之。","春江花月夜\n春江潮水連海平,海上明月共潮生。\n灩灩隨波千萬裡,何處春江無月明。\n江流宛轉繞芳甸,月照花林皆似霰。\n空裡流霜不覺飛,汀上白沙看不見。\n江天一色無纖塵,皎皎空中孤月輪。\n江畔何人初見月?江月何年初照人?\n人生代代無窮已,江月年年望相似。\n不知江月待何人,但見長江送流水。\n白雲一片去悠悠,青楓浦上不勝愁。\n誰家今夜扁舟子?何處相思明月樓?\n
可憐樓上月裴回,應照離人妝鏡臺。\n玉戶簾中卷不去,搗衣砧上拂還來。\n此時相望不相聞,願逐月華流照君。\n鴻雁長飛光不度,魚龍潛躍水成文。\n昨夜閒潭夢落花,可憐春半不還家。\n江水流春去欲盡,江潭落月復西斜。\n斜月沉沉藏海霧,碣石瀟湘無限路。\n不知乘月幾人歸,落月搖情滿江樹。","詠早梅\n兔園標物序,驚時最是梅。\n銜霜當路發,映雪擬寒開。\n枝橫卻月觀,花繞凌風臺。\n朝灑長門泣,夕駐臨邛杯。\n應知早飄落,故逐上春來。","水調歌頭\n明月幾時有?把酒問青天。\n不知天上宮闕,今夕是何年。\n我欲乘風歸去,又恐瓊樓玉宇,高處不勝寒。\n起舞弄清影,何似在人間?\n轉朱閣,低綺戶,照無眠。\n
不應有恨,何事長向別時圓?\n人有悲歡離合,月有陰晴圓缺,此事古難全。\n但願人長久,千里共嬋娟"] override func viewDidLoad() { super.viewDidLoad() self.title = "古詩詞賞析" setupTableView() } func numberOfSections(in tableView: UITableView) -> Int { return 1 } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return textArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell:PoemTableViewCell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath) as! PoemTableViewCell if cell .isEqual(nil) { cell = PoemTableViewCell.init(style: .default, reuseIdentifier: identifier) } cell.showLabel.text = textArray[indexPath.row] as? String return cell } func setupTableView() { self.myTableView.register(UINib.init(nibName: "PoemTableViewCell", bundle: nil), forCellReuseIdentifier: identifier) }
  • 最後,只需要在viewDidLoad中設定UITableView的兩個屬性estimatedRowHeight和rowHeight即可;
func setupTableView() {
        self.myTableView.tableFooterView = UIView()
        self.myTableView.register(UINib.init(nibName: "PoemTableViewCell", bundle: nil), forCellReuseIdentifier: identifier)

        self.myTableView.estimatedRowHeight = 60
        self.myTableView.rowHeight = UITableViewAutomaticDimension
    }
  • 附上我的效果圖:

這裡寫圖片描述

  • 當你需要顯示的內容較短的時候,還可以用另外一種方式實現:即為實現UITableView的tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat這個協議:
let textString:NSString = "關關雎鳩,在河之洲。\n窈窕淑女,君子好逑。\n參差荇菜,左右流之。\n窈窕淑女,寤寐求之。\n求之不得,寤寐思服。\n悠哉悠哉,輾轉反側。\n參差荇菜,左右采之。\n窈窕淑女,琴瑟友之。\n參差荇菜,左右芼之。\n窈窕淑女,鐘鼓樂之。"

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let attribute = [NSShadowAttributeName:UIFont.systemFont(ofSize: 15)]
        return textString.boundingRect(with: CGSize.init(width: 300, height: 0), options: .usesDeviceMetrics, attributes: attribute, context: nil).size.width+10
    }
  效果一樣:

這裡寫圖片描述