【问题标题】:Swift: Auto layout and table view cells with dynamic heightsSwift:具有动态高度的自动布局和表格视图单元格
【发布时间】:2015-02-09 22:03:04
【问题描述】:

我创建了一个测试项目来了解具有可变高度的表格单元格。我已经阅读了许多关于 StackOverflow 和其他地方的教程,但我仍然做错了什么,我不太确定是什么。

如何确保无论字符串长度如何,表格单元格的高度都会发生变化以容纳所有文本?

在这里,我使用一系列不同长度的字符串设置我的表格视图。

这是我的模拟器显示的内容以及我的代码:

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var items: [String] = ["We", "Aenean lacinia bibendum nulla sed consectetur.", "Vestibulum id ligula porta felis euismod semper. Maecenas sed diam eget risus varius blandit sit amet non magna. Sed posuere consectetur est at lobortis. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Etiam porta sem malesuada magna mollis euismod. Sed posuere consectetur est at lobortis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor.", "Blah", "one two three", "Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam.", "gum gum gum gum", "Blah", "one two three", "Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam.", "gum gum gum gum", "Blah", "one two three", "Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam.", "gum gum gum gum", "Blah", "one two three", "Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam.", "gum gum gum gum", "Blah", "one two three", "Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam.", "gum gum gum gum", "Blah", "one two three", "Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam.", "gum gum gum gum"]

    @IBOutlet var tableView: UITableView!

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

        cell.textLabel?.text = self.items[indexPath.row]

        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        println("You selected cell #\(indexPath.row)!")
    }



    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "cell")

        self.tableView.rowHeight = UITableViewAutomaticDimension
        self.tableView.estimatedRowHeight = 130.0
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func prefersStatusBarHidden() -> Bool { return true }
}

在我的故事板中,我设置了一个带有一些约束的测试单元(可能做错了,不确定)。约束似乎是确定这个实现或完全搞砸它的关键

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 抱歉,您的实际问题是什么?有什么问题?
  • 我的问题是单元格应该是可变高度以包含数组项中的所有文本。相反,它们会被... 截断。我也会在问题中重新添加这个,这样更清楚
  • 你是不是把UITableViewCell中的标签做成了多行标签?
  • 当前设置为 0。我也尝试使用值 1-5,没有任何变化
  • 当我使用故事板时,问题在于没有正确使用自动布局来确保每个元素都放置了适当的约束、宽度和高度。我已经停止使用故事板并开始使用制图 (github.com/robb/Cartography) 进行手动布局以获得更多控制。这已经不是问题了

标签: uitableview swift ios8


【解决方案1】:

要对多行标签使用自动布局,您需要设置preferredMaxLayoutWidth 属性(在viewDidLoad 或其他适当的地方)。这将导致自动布局“做正确的事”并使您的标签扩展为多行标签。见https://developer.apple.com/library/ios/documentation/UIKit/Reference/UILabel_Class/index.html#//apple_ref/occ/instp/UILabel/preferredMaxLayoutWidth

请注意,要使其在 UITableViewCell 中正常工作,您还应该回复 heightForRowAtIndexPath - 请参阅 https://developer.apple.com/library/prerelease/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/index.html#//apple_ref/occ/intfm/UITableViewDelegate/tableView:heightForRowAtIndexPath

【讨论】:

  • 根据我所做的研究,我认为这两个都不是正确的答案。 self.tableView.rowHeight = UITableViewAutomaticDimensionself.tableView.estimatedRowHeight = 130.0 旨在与自动布局约束一起工作,以基本上设置最小值或自动计算尺寸。 heightForRowAtIndexPath 似乎用硬常数覆盖
  • 如果您不相信文档是正确的,我无法帮助您...在 Apple 的文档中很清楚:当应用布局约束时,此属性会影响标签的大小。在布局过程中,如果文本超出此属性指定的宽度,则附加文本会流动到一个或多个新行,从而增加标签的高度。
  • heightForRowAtIndexPath 中,您计算​​标签在“自动布局”后的高度,并返回此高度。
  • 我不同意的原因是我已经阅读了许多其他教程,其中指定了我在评论中提到的两行,没有人强调heightForRowAtIndexPath 方法。再说一次,我不能让它工作,所以谁知道什么是正确的?
【解决方案2】:

请也实现它

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath : NSIndexPath) -> CGFloat {
        return UITableViewAutomaticDimension
    }

【讨论】:

    猜你喜欢
    • 2013-05-16
    • 2014-10-19
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-06
    相关资源
    最近更新 更多