4

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

我想在引擎盖下的某个地方(可能在 中layoutSubviews),有一条线,UITableViewCell.m例如:

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

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

此外,在我第一次尝试的实现中,显示了子视图,但它的默认单元格高度为 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;
4

1 回答 1

6

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

UIViewNSView在 OS X 上)的指定初始化程序是-initWithFrame:. UITableView为is指定的初始值设定项initWithFrame:style:。由于视图通常需要在添加到其父视图后立即使其可见的子视图可用,因此可以在指定的初始化程序中创建和设置它们。

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

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

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

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

为了使自动调整掩码正常工作,您必须自己配置视图的初始帧(在代码中或在 nib 中)。自动调整视图大小会影响它如何响应其父视图边界的变化,但无助于确定视图的初始帧。

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

于 2013-07-27T17:41:59.467 回答