UITableViewCell contentView自定义泄露图像框架问题

时间:2012-09-01 09:32:21

标签: ios uitableview

免责声明:我工作太晚了。但是,我决心今晚通过这个。

我有一个应用程序,我支持不同的颜色主题。暗细胞背景一直存在问题。

我一直在寻找一种强大的方法,在黑色背景的uitableviewcells中绘制配件披露图标。

我决定尝试重写setAccessoryType以继承我50多个视图的功能:

-(void) addWhiteDisclosureImage {
    UIImageView *disclosureView = (UIImageView*) [self.contentView viewWithTag:kDisclosureReplacementImageTag];

    if(!disclosureView) {
        [super setAccessoryType:UITableViewCellAccessoryNone];
        disclosureView = [[UIImageView alloc] initWithImage:self.whiteDisclosureImage];
        disclosureView.tag = kDisclosureReplacementImageTag;
        disclosureView.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;

DebugLog(@"%f, %f", self.frame.size.width, self.frame.size.height);

        [self.contentView addSubview:disclosureView];
        [self.contentView bringSubviewToFront:disclosureView];
        [disclosureView release];
    }
}

- (void)setAccessoryType:(UITableViewCellAccessoryType)accessoryType {
    if(accessoryType == UITableViewCellAccessoryDisclosureIndicator) {
        if ([self.viewController isKindOfClass:[ViewControllerBase class]]) {
            ViewControllerBase *view = (ViewControllerBase*) self.viewController;
            if(view.colorTheme && view.colorTheme.controlBackgroundColor) {
                if([ViewColors colorAverage:view.colorTheme.controlBackgroundColor] < 0.2) { //substitute white disclosure indicator
                    [self addWhiteDisclosureImage];
                    return;
                } else { //not dark enough
                    [self removeWhiteDisclosureImage];
                    [super setAccessoryType:accessoryType];
                    return;
                }

            } else { //no colorTheme.backgroundColor
                [self removeWhiteDisclosureImage];
                [super setAccessoryType:accessoryType];
                return;
            }
        } else { //viewController is not type ViewControllerBase
            [self removeWhiteDisclosureImage];
            [super setAccessoryType:accessoryType];
            return;
        }

    }

    UIView *disclosureView = [self.contentView viewWithTag:kDisclosureReplacementImageTag];
    if(disclosureView)
        [disclosureView removeFromSuperview];
    [super setAccessoryType:accessoryType];
}

此覆盖通常在cellForRowAtIndexPath中调用。

在我向下钻取并回来之前,这似乎是一个不错的选择。对于某些单元格,单元格框架将比第一次更大。这种情况始终发生在我一直在测试的6个列表中的同一个单元格中。这个单元格显然有一些独特之处:它是frame.size。

这是我为第一个tableview加载记录的单元格的大小(在某些情况下每次加载/重新加载): 320.000000,44.000000

这是调用reloadData后我得到的一些(不是全部)单元格的差异: 759.000000,44.000000

有谁知道为什么会这样?

更新:可疑单元格的自定义附件公开视图几乎就像它的自动调整标志设置为无。我通过将all设置为none来确认这一点。我说几乎是因为我看到它排在reloadData之后的位置。一瞬间,它会向左移动(当我选择不进行自动调整时,它们都会结束)。

1 个答案:

答案 0 :(得分:0)

不要乱用子视图和计算框架 只需将accessoryView替换为新的imageView即可。让iOS完成工作。