1

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

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

我一直在寻找一种强大的方法来在具有黑色背景的 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

有谁知道为什么会发生这种情况?

更新:可疑单元格的自定义附件披露视图几乎就像它的自动调整大小标志设置为无一样。我通过将所有设置为无来确认这一点。我说几乎是因为我看到它在 reloadData 之后排列在它应该在的位置。一秒钟后,它向左移动(当我选择不自动调整大小时,它们都结束了)。

4

1 回答 1

0

不要乱用子视图和计算框架。
只需将附件视图替换为新的 imageView。让 iOS 来完成这项工作。

于 2012-09-02T20:48:28.160 回答