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
    }
  • 附上我的效果图:

Swift之动态适配UITableView的cell高度_第1张图片

  • 当你需要显示的内容较短的时候,还可以用另外一种方式实现:即为实现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
    }
  效果一样:

Swift之动态适配UITableView的cell高度_第2张图片

你可能感兴趣的:(Swift开发)