gpt4 book ai didi

ios - 在 View 生命周期中,UITableViewCell 何时创建其导出/标签/ subview ?

转载 作者:可可西里 更新时间:2023-11-01 05:30:11 26 4
gpt4 key购买 nike

我正在尝试创建一个 UIView 作为子类 UITableViewCell 的 subview 。本质上,我想要一个与单元格大小相同的 View ,并且位于单元格的 contentViewbackgroundView 之间。

我想在引擎盖下的某个地方(可能在 layoutSubviews 中),在 UITableViewCell.m 中有一行是这样的:

if (self.contentView != nil) {
[self addSubview:self.contentView];
}

如果我想模仿 Apple 的做法,我应该将这段代码放在我自己的自定义 UITableViewCell 子类中的什么地方?

此外,在我第一次尝试实现时,显示了 subview ,但它的默认单元格高度为 44px,而不是我在 tableView:heightForRowAtIndexPath: 中指定的高度。还会出现其他小错误,这就是为什么我想尝试复制 Apple 的实现而不是尝试我自己的半功能实现。

编辑:到目前为止,这是我的代码:

CustomTableViewCell.h

interface CustomTableViewCell : UITableViewCell
@property (nonatomic, strong) UIView *newSubview;
@end

CustomTableViewCell.m

- (void)layoutSubviews {
[super layoutSubviews];

if (self.newSubview != nil) {
self.newSubview.autoresizingMask = UIViewAutoresizingFlexibleHeight;
[self insertSubview:self.newSubview aboveSubview:self.backgroundView];
}
}

tableViewController.m

static NSString *CellIdentifier = @"Cell";
myCustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

UIView *view = [[UIView alloc] initWithFrame:cell.frame];
view.backgroundColor = [UIColor orangeColor];
cell.newSubview = view;

最佳答案

一般来说,对象应该在其指定的初始化器中创建它们的属性,除非有一个压倒一切的设计原则(或性能/资源问题)要求它们稍后创建它们。

UIView(和 OS X 上的 NSView)的指定初始化程序是 -initWithFrame:UITableView 的指定初始化程序是 initWithFrame:style:。由于 View 通常需要在添加到其父 View 后立即使用它的可见 subview ,因此可以在指定的初始化程序中创建和设置它们。

-layoutSubviews 用于更新布局,即中心、边界(或框架)和(可选)变换。现在,由于消息的顺序。您不想在 -layoutSubviews 中创建 subview ,因为该方法在您的 View 的生命周期内被重复调用,因为其父 View 的边界已更改以及它被删除或重新添加到其父 View View ,或者随着它的 subview 的改变。

对于 UITableView,每次重新加载表格时都会调用 -layoutSubviews

此规则的一个典型异常(exception)是创建用作表格行的 UITableViewCell,它必须动态创建。

-heightForRowAtIndexPath 方法提供了一个 TableView ,其中包含它需要为该行的单元格留出的空间量,但实际上不会导致单元格大小调整。你必须在创建单元格时自己设置单元格的边界(或者单元格可以在 -initWithStyle:reuseIdentifier: 中设置自己的边界,如果它被设计为固定值)。如果您的单元格大小与表格的预期不符,则会出现间隙或重叠。

要使自动调整蒙版正常工作,您必须自己配置 View 的初始框架(在代码中或在 nib 中)。自动调整 View 大小会影响它对其父 View 边界变化的响应方式,但无助于确定 View 的初始框架。

具体来说,您必须为单元格的 subview 设置初始帧(并确保同级 subview 顺序等)。这在 nib 中比在代码中更容易做到。

关于ios - 在 View 生命周期中,UITableViewCell 何时创建其导出/标签/ subview ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17899392/

26 4 0