UITableViewCell 计算正确的高度,但 UILabel 不换行

Posted

技术标签:

【中文标题】UITableViewCell 计算正确的高度,但 UILabel 不换行【英文标题】:UITableViewCell calculates the correct height, but the UILabel doesn't wrap 【发布时间】:2015-03-03 00:32:41 【问题描述】:

如果不设置明确的首选宽度,我无法让 UILabel 自动换行。请帮忙。

这是我在 UITableViewCell 中的 UILabel 界面生成器

我的结果是:

但是,如果我指定一个明确的首选宽度,如下所示:

我得到以下信息:

虽然它有一些奇怪的垂直间距,但至少它是正确换行的。

另外,这是我在 UITableViewController 中构建行的方式:

override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!, object: PFObject!) -> PFTableViewCell! 

    let cell = tableView.dequeueReusableCellWithIdentifier(Constants.CellReuseIdentifier, forIndexPath: indexPath) as? BurnFeedTableViewCell ??
        BurnFeedTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: Constants.CellReuseIdentifier)

    cell.nameOfBurnLabel?.text = object.objectForKey("name") as? String
    if let owner = object.objectForKey("owner") as? PFUser 
        cell.ownerLabel?.text = owner.username
     else 
        cell.ownerLabel?.text = "unknown"
    

    return cell

并将 rowHeight 和estimatedRowHeigh 定义为:

override func viewDidLoad() 
    super.viewDidLoad()

    self.tableView.estimatedRowHeight = 100.0
    self.tableView.rowHeight = UITableViewAutomaticDimension

我真的很想在不必指定明确高度的情况下让它工作。另外,我玩过 contentCompressionResistancePriority 没有运气。

这绝对类似于以下 SO 问题:Using ios 8 flexible table cells, cell height changes but text doesn't wrap

但是,那里的解决方案似乎不起作用。事实上,类似的问题还有很多。不过,我似乎无法让它们工作。

编辑:来自 main.storyboard 的 tableViewCell 的 XML

<tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="Burn Feed Cell"
               rowHeight="95" id="bif-hV-Vqt" customClass="BurnFeedTableViewCell" customModule="Burn"
               customModuleProvider="target">
    <rect key="frame" x="0.0" y="0.0"  />
    <autoresizingMask key="autoresizingMask"/>
    <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES"
                              contentMode="center" tableViewCell="bif-hV-Vqt" id="KGP-Sx-cZC">
        <autoresizingMask key="autoresizingMask"/>
        <subviews>
            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251"
                   verticalHuggingPriority="251" text="owner" lineBreakMode="tailTruncation"
                   baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO"
                   translatesAutoresizingMaskIntoConstraints="NO" id="TZ9-cx-K29">
                <rect key="frame" x="8" y="37"  />
                <fontDescription key="fontDescription" type="system" pointSize="17"/>
                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                <nil key="highlightedColor"/>
            </label>
            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251"
                   verticalHuggingPriority="251" text="Burn Name" lineBreakMode="wordWrap" numberOfLines="0"
                   baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="90"
                   translatesAutoresizingMaskIntoConstraints="NO" id="v96-dx-9z5">
                <rect key="frame" x="8" y="8"  />
                <fontDescription key="fontDescription" type="system" pointSize="17"/>
                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                <nil key="highlightedColor"/>
            </label>
            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251"
                   verticalHuggingPriority="251" text="countdown" lineBreakMode="tailTruncation"
                   baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO"
                   translatesAutoresizingMaskIntoConstraints="NO" id="6YZ-ne-79f">
                <rect key="frame" x="506" y="37"  />
                <fontDescription key="fontDescription" type="system" pointSize="17"/>
                <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
                <nil key="highlightedColor"/>
            </label>
        </subviews>
        <constraints>
            <constraint firstItem="v96-dx-9z5" firstAttribute="leading" secondItem="KGP-Sx-cZC"
                        secondAttribute="leadingMargin" id="Iwe-kT-1Do"/>
            <constraint firstItem="6YZ-ne-79f" firstAttribute="trailing" secondItem="KGP-Sx-cZC"
                        secondAttribute="trailingMargin" id="JOA-d6-q3X"/>
            <constraint firstItem="6YZ-ne-79f" firstAttribute="baseline" secondItem="TZ9-cx-K29"
                        secondAttribute="baseline" id="JXU-Hf-vVb"/>
            <constraint firstItem="TZ9-cx-K29" firstAttribute="leading" secondItem="KGP-Sx-cZC"
                        secondAttribute="leadingMargin" id="VOG-Xh-9wd"/>
            <constraint firstAttribute="bottomMargin" relation="greaterThanOrEqual" secondItem="TZ9-cx-K29"
                        secondAttribute="bottom" constant="5" id="am1-l0-8EV"/>
            <constraint firstItem="TZ9-cx-K29" firstAttribute="top" secondItem="v96-dx-9z5" secondAttribute="bottom"
                        constant="8" symbolic="YES" id="jLQ-yQ-A8V"/>
            <constraint firstItem="v96-dx-9z5" firstAttribute="trailing" secondItem="KGP-Sx-cZC"
                        secondAttribute="trailingMargin" id="sl2-Fb-sWy"/>
            <constraint firstItem="v96-dx-9z5" firstAttribute="top" secondItem="KGP-Sx-cZC" secondAttribute="topMargin"
                        id="xt3-Em-EaP"/>
        </constraints>
    </tableViewCellContentView>
    <connections>
        <outlet property="countdownLabel" destination="6YZ-ne-79f" id="te1-QF-Nuo"/>
        <outlet property="nameOfBurnLabel" destination="v96-dx-9z5" id="Wki-e1-0Np"/>
        <outlet property="ownerLabel" destination="TZ9-cx-K29" id="wqh-Cj-yQX"/>
    </connections>
</tableViewCell>

【问题讨论】:

【参考方案1】:

您的问题与自动布局有关。为了获得正确的宽度/高度换行,您需要确保 UITableViewCell 中的所有元素都被适当地限制在单元格的左边距到右边以及从上边距到底部。

【讨论】:

我知道这一点,一切都应该能够计算出它的 x 并且你的坐标没有歧义。我玩过各种维度,但没有运气。如果我要分享我的限制,你能告诉我需要修复什么吗? 当然。用您的问题发布对单元格元素的所有限制 使用 main.storyboard 中的主题 tableview 的 xml 编辑问题 对我添加到问题中的约束有何评论? 我无法重现您的结果。试试这个:github.com/kellanburket/swift-tableview-test。我一直在以相同的约束运行它,并且 tableview 单元格相应地拉伸。您是否在代码中引入了其他任何不受约束的内容?【参考方案2】:

您是否为所有标签禁用了自动调整掩码转换?

cell.nameOfBurnLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
cell.ownerLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
cell.countdownLabel.setTranslatesAutoresizingMaskIntoConstraints(false)

至少我必须这样做才能让动态单元格高度与标签一起使用。

【讨论】:

没有必要,因为单元格是故事板的一部分

以上是关于UITableViewCell 计算正确的高度,但 UILabel 不换行的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 UILabel 的高度正确增加 UITableViewCell

UITableViewCell 中带有多行标签的 UIStackView 高度不正确

动态计算自定义 UITableViewCell 的高度

UITableViewCell 动态高度不适用于尺寸类

动画 UITableViewCell 高度

UITableViewCell 的异步高度更改