自定义 UITableView Cell 的 Stack View 无法检测到 Super View Dimension

Posted

技术标签:

【中文标题】自定义 UITableView Cell 的 Stack View 无法检测到 Super View Dimension【英文标题】:Custom UITableView Cell's Stack View Cannot Detect Super View Dimension 【发布时间】:2019-02-24 02:29:54 【问题描述】:

上下文 我有一个 UITableViewController,其中包含在 .xib 文件中设计的自定义单元格。在那个 .xib 文件中,我试图设置动态宽度,以便将单元格宽度分成三个子视图。

问题是单元格似乎无法获得合适的宽度,导致单元格无法填满整个宽度。这是一张图片,可以更好地说明我的意思。

cell_not_filling_width

我的理解(可能完全误解了这一点)在 .xib 文件中设置框架约束是不好的,因为程序直到运行时才知道宽度。换句话说,awakeFromNib (1.) 在确定屏幕宽度之前加载...所以知道如何解决这个问题.. 任何指导将不胜感激。

    大概这是设置宽度的地方——当我在cellForRowAt 打印出 .xib 文件时,界面生成器上的宽度是相同的

注意事项在我的 viewDidLoad 函数中,我已经注册了 nibfile,所以我认为这不是问题所在。 tableView.register(UINib(nibName: "NewTableViewCell", bundle: nil) , forCellReuseIdentifier: "newTableViewCell").

这里有一些可能相关的代码。

NewTableViewCell.swift

import UIKit

class NewTableViewCell: UITableViewCell 

    @IBOutlet var typeLabel: UILabel!
    @IBOutlet var timeLabel: UILabel!
    @IBOutlet var completedLabel: UILabel!
    @IBOutlet var correctLabel: UILabel!
    @IBOutlet var parentView: UIView!

    override func awakeFromNib() 
        super.awakeFromNib()
        // Initialization code
    


parentView 是一个包含三个子视图的视图。

Here's.xib 文件的图片

Here's 我对 .xib 文件的约束图片(看起来很乱)

更新 尝试了stack view的方法:XCode只是将宽度定义为宽度最大的子视图(根据文本的大小)

Here是当前情况和当前约束的图片

我认为constraints on the label 也可能是相关的:

更新2 好的,我想我找到了问题所在;基本上堆栈视图似乎无法检测到超级视图的长度和宽度以及它的尺寸。

注意我已经编辑了约束。

Here 是我将宽度和高度设置为恒定值时的样子。堆栈视图实际上会转到设置的约束

Here 就是我去掉这些限制后的样子。所以看起来宽度和高度都是 0。这就是为什么我相信超级视图没有采用约束。

有谁知道如何解决这个问题?

【问题讨论】:

尝试将每组相关元素放在一个 stackView 中,然后将所有内容放在一个 stackView 中,然后将该 stackVew 的尾随前导顶部和底部设置为零 我尝试了这种方法:现在得到三个缺少约束的错误。堆栈中的每个子视图一个。所有三个缺少的约束错误都说我需要约束:X 位置或宽度。我认为内容视图没有给出正确的约束 为了进一步澄清,如果我为每个子视图中的标签取消设置约束 0 0 0 0。因此,如果我不取消设置子视图的约束,XCode 只是将宽度定义为宽度最大的子视图(根据文本的大小)。 你有你的代码的存储库,所以我可以看看吗? 不,不幸的是,这不在公共回购中:(。我可以分享代码的特定部分吗? 【参考方案1】:

在 cellforRow 中尝试以下代码。

为 stackviewWidth 添加 IBOutliet 并动态设置,如下所示。还可以通过向单元格添加背景颜色来检查单元格是否达到设备的全宽。

if  let appDelegate =  UIApplication.shared.delegate as? AppDelegate,
    let window = appDelegate.window 
    cell.stackViewWidthConstraint = window.bounds.width

【讨论】:

抱歉,我不知道如何为 stackViewWidth 添加 IBOutlet。我知道如何为 stackView 添加一个 IBOutlet,但不知道如何为宽度本身添加一个 IBOutlet。您是要为 stackView 添加它吗?如果是这样,您如何参考stackView的宽度?我试过这个cell.stackView.frame.size.width = window.bounds.width,但它似乎没有做任何事情。你能解释一下我的误解吗? 也将背景颜色设置为蓝色,但似乎不显示。 给stackview设置一个width Constraint,然后拖拽width到viewContoller文件中设置Outlet——drive.google.com/open?id=1G7sxHbOXzdYB3RxOmCSMquQjI67PxdnF 我似乎无法绕过错误:Cannot assign value of type 'CGFloat' to type 'NSLayoutConstraint?'。你是怎么解决的? 将宽度设置为 100 到 stackview,然后将出口添加到宽度约束

以上是关于自定义 UITableView Cell 的 Stack View 无法检测到 Super View Dimension的主要内容,如果未能解决你的问题,请参考以下文章

UITableView(自定义cell)试水心得

iOS开发总结-UITableView 自定义cell和动态计算cell的高度

UITableView的自定义以及自适应高度

iOS UITableView

uitableview - 自定义图像不断加载到 cell.contentView

正确委派自定义 Cell 中的按钮操作以删除 UITableView 中的行