UITableViewCell:获取单元格

时间:2016-03-27 16:28:00

标签: ios swift uitableview uilabel

在自定义单元格中获取正确的标签宽度时遇到问题。 这是我在故事板中的单元格: cell in storyboard

创建表时,我知道当调用cellForRowAtIndexPath时,单元格刚刚创建,尚未添加到UITableView,因此标签的宽度为304px。这导致结果如下:

Wrong result

滚动后,单元格已添加到UITableView中,因此显示正确,标签宽度为164px。

Correct result

在将细胞/标签添加到UITableView之前,有没有办法知道细胞/标签的确切宽度?

标签上的限制:领先,尾随,顶部和高度 enter image description here

以下是源代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell: ArticleCell = tableView.dequeueReusableCellWithIdentifier("articleCell", forIndexPath: indexPath) as! ArticleCell
    let item = array.objectAtIndex(indexPath.row) as! Article
    cell.showDataForArticle(item, dateFormatter: dateFormatter)
    return cell
}

func showDataForArticle(article: Article, dateFormatter: NSDateFormatter) {
    self.titleLbl.text = article.articleTitle
    titleHeightConstraint.constant = titleLbl.requiredHeight() <--- where problem happens

    self.thumbnailImgView.imageLink(article.articleThumbnailLink!)
    self.authorLbl.text = article.articleCreator
    self.dateLbl.text = dateFormatter.stringFromDate(article.articlePubDate!)
}


extension UILabel {
func requiredHeight() -> CGFloat {
    let frame = CGRectMake(0, 0, self.frame.size.width, CGFloat.max)
    let label: UILabel = UILabel(frame: frame)
    label.numberOfLines = 0
    label.lineBreakMode = .ByWordWrapping
    label.font = self.font
    label.text = self.text
    label.sizeToFit()

    return label.frame.size.height
}

3 个答案:

答案 0 :(得分:0)

尝试在titleLbl.requiredHeight()方法

中调用func tableView(_ tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath)

答案 1 :(得分:0)

就试图获得标签的宽度而言,你只尝试了一些

的行
self.YourLabelName.bounds.width

答案 2 :(得分:0)

您可以根据使用自动布局显示的文字调整其高度。

<强> 1。为此,您不应为单元格设置静态高度,只需添加以下两个代表,

    -(CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
        return 44;
    }

    -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
       return UITableViewAutomaticDimension;
    }

<强> 2。您应该为您的单元格设置从上到下的约束 在您的情况下,您的标题标签应包含TopSpace到Cell,LeadingSpace到ImageView,TrailingSpace到Cell(标准间距)和BottomSpace到AuthorLabel(标准间距)。

第3。根据文本,您想要的动态高度标签应该将行数设置为0,将LineBreakMode设置为Word Wrap。

多数民众赞成,也发现此链接与您的情况相似,

Dynamic UITableViewCell content does not expand cell

Dynamically increase height of UILabel & TableView Cell?