在视图生命周期中,UITableViewCell何时创建其出口/标签/子视图



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

我想在引擎盖下面的某个地方(可能在layoutSubviews中),UITableViewCell.m中有一行类似于:

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

如果我想模仿苹果的做法,我应该把这些代码放在我自己的自定义UITableViewCell子类中的哪里?

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

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

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:。由于视图通常需要在添加到其超级视图后立即使其可见子视图可用,因此可以在指定的初始值设定项中创建和设置它们。

-layoutSubviews用于更新布局,即中心、边界(或帧)和(可选)变换。现在,因为消息的顺序。您不想在-layoutSubviews中创建子视图,因为该方法在视图的生存期内会被重复调用,因为它的父视图的边界发生了更改,它被删除或重新添加到父视图中,或者它的子视图发生了更改。

在UITableView的情况下,每次重新加载表时都会调用-layoutSubviews

此规则的一个典型例外是创建用作表的行的UITableViewCell,必须动态创建。

-heightForRowAtIndexPath方法为表视图提供了该行单元格所需的空间量,但实际上并不会导致单元格的大小调整。创建单元格时,您必须自己设置单元格的边界(或者,如果单元格设计为固定值,则可以在-initWithStyle:reuseIdentifier:中设置自己的边界)。如果单元格的大小与表的预期不匹配,则会出现空白或重叠。

为了使自动resizing掩码正常工作,您必须自己配置视图的初始框架(在代码或笔尖中)。自动调整视图大小会影响其对父视图边界中更改的响应方式,但无助于确定视图的初始帧。

具体来说,您必须为单元格的子视图设置初始框架(还必须确保同级子视图的顺序等)。这在笔尖中比在代码中更容易做到。

最新更新