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 です。

最初のテーブルビュー ロード (場合によってはすべてのロード/リロード) でログに記録するセルのサイズは次のとおりです: 320.000000、44.000000

これは、reloadData: 759.000000, 44.000000 を呼び出した後に一部の (すべてではない) セルに対して得られる違いです。

なぜこれが起こるのか誰にも分かりますか?

更新: 疑わしいセルのカスタム アクセサリ開示ビューは、自動サイズ変更フラグが [なし] に設定されているように動作します。すべてを none に設定することで、これを確認しました。reloadData の後に本来あるべき場所に並んでいることがわかるからです。一瞬後、左に移動します(自動サイズ変更なしを選択すると、すべてが終了します)。

4

1 に答える 1

0

サブビューと計算フレームをいじらないでください。
accessoriesView を新しい imageView に置き換えるだけです。iOSに任せましょう。

于 2012-09-02T20:48:28.160 に答える