4

アプリケーションを iOS 7 に移植していますが、tableView で奇妙な動作が発生しています。セルを選択すると、明らかな理由もなくセパレーターが消えます。それだけでなく、フレームがこれを示していなくても、選択された状態の背景画像も約 1 ピクセル上に移動します。iOS 6 以前のオペレーティング システムでは、これらの問題は発生しません。

テーブル ビューを次のように定義します。

    statisticsTableView = [[UITableView alloc] initWithFrame:CGRectMake(170.0f, 0.0f, 150.0f, window.size.height) style:UITableViewStylePlain];
    statisticsTableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]];
    statisticsTableView.separatorColor = [UIColor darkGrayColor];
    //statisticsTableView.separatorInset = UIEdgeInsetsZero; // <- Makes app crash in iOS6 or older
    statisticsTableView.showsHorizontalScrollIndicator = NO;
    statisticsTableView.delegate = self;
    statisticsTableView.dataSource = self;

セルはサブクラス化され、関連する部分は次のとおりです (通常の背景画像と選択された背景画像の両方がまったく同じサイズであり、iOS6 以前で正しく表示されます。選択された背景画像がわずかに高く表示されるのは iOS 7 のみです)。

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cell_background_corp.png"]];
    self.backgroundView = backgroundView;

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cell_background_corp_selected.png"]];
    self.selectedBackgroundView = backgroundView;

さて、他の人がすでにこの質問 (または少なくともその一部) をしていたことは知っていますが、そこにある答えはどれも私にとって役に立ちませんでした. さらに参考までに、これらの「解決策」を試してみましたが、うまくいきませんでした。

Putting this into my didSelectrowAtIndexPath made my cells deselect. 
But, I need my selected cell to stay selected, and besides 
it looked really awkward with the blinking as swithces between states:

    [self.tableView deselectRowAtIndexPath:indexPath animated:NO];
    [self.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

別のもの:

Putting this into the heightForRowAtIndexPath delegate method 
as a return value did absolutely nothing:

    ceilf(rowHeight);

そして最後に:

This was my attempt to fix the background image position bug. I modified
the way I added the selected background view in the subclassed tableView cell,
but it did not do squat:

    UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 150.0f, 70.0f)];
    if (iOSVersion >= 7.0f)
    {
        backgroundView.frame = CGRectMake(0.0f, 1.0f, 150.0f, 70.0f);
    }
    backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"cell_background_corp_selected.png"]];
    self.selectedBackgroundView = backgroundView;
4

1 に答える 1

1

同様の問題があり、それを修正したのは、次のように UITableViewCell サブクラスで layoutSubviews をオーバーライドすることでした。

- (void)layoutSubviews
{
    [super layoutSubviews];
    self.selectedBackgroundView.frame = self.backgroundView.frame;
}

重要なのは、[super layoutSubviews]最初に電話をかけることです。

ちなみに、デフォルトの動作はiOS7で意図されたものだと思います。Apple Mail アプリを見ると、セルを選択すると区切り線も消え、区切り線があった場所にアクティブな背景が描画されることがわかります。

于 2014-05-17T09:12:44.963 に答える