1

次のコードを使用して、UIScrollViewの子孫に「固定」行ヘッダーを作成します。シミュレーターではうまく機能しますが、残念ながらiPadではちらつきます。(行ヘッダービューの左側に、白い1pxの線が表示されたり消えたりします。)何を改善できますか?

- (void)initSubviews
{
    const int ROW_COUNT = 20;
    rowHeaderViews = [[NSMutableArray alloc]initWithCapacity:ROW_COUNT];
    rowViews = [[NSMutableArray alloc]initWithCapacity:ROW_COUNT];

    [self setContentSize:CGSizeMake(2000, [self frame].size.height)];

    for (int i = 0; i < ROW_COUNT; i++)
    {
        UIView *header = [self createRowHeaderViewForRowNum:i];
        [rowHeaderViews addObject:header];

        UIView *row = [self createRowViewForRowNum:i];
        [rowViews addObject:row];

        [self addSubview:row];
        [self addSubview:header];
    }
    [self layoutSubviews];
}

- (void)layoutSubviews
{
    int x = [self contentOffset].x;
    for (UIView *view in rowHeaderViews) {
        [view setFrame:CGRectMake(x, view.frame.origin.y, view.frame.size.width, view.frame.size.height)];
    }
}

- (UIView *)createRowHeaderViewForRowNum: (int)rowNum
{
    UILabel *view = [[UILabel alloc]initWithFrame:CGRectMake(0, rowNum * 20, 200, 20)];
    [view setBackgroundColor:[UIColor colorWithWhite:0.8*(20-rowNum)/20 alpha:1]];
    [view setText:[NSString stringWithFormat:@"Row Header %d", rowNum]];
    return view;
}

- (UIView *)createRowViewForRowNum: (int)rowNum
{
    UILabel *view = [[UILabel alloc]initWithFrame:CGRectMake(200, rowNum * 20, 1800, 20)];
    [view setBackgroundColor:[UIColor colorWithRed:rowNum/20.0 green:0 blue:0 alpha:1]];
    [view setText:[NSString stringWithFormat:@"Row Content %d", rowNum]];
    return view;
}

助けてくれてありがとう!

編集:iPadにはRetinaディスプレイが搭載されています。「通常の」iPadでシミュレーターを使用する場合、ちらつきはありません。シミュレーターを「Retinaディスプレイ」iPadに切り替えると、このちらつきもあります。多分これはポイント/ピクセルの違いについての何かですか?

4

1 に答える 1

3

私は自分でバグを見つけました。お邪魔になってすみません。他の誰かが同じ問題を抱えている場合:contentOffset.xはfloat値であり、Retinaディスプレイの.5値が含まれています。でint変数に割り当てるとlayoutSubviews、問題が発生しました。これは修正です(「int」を「CGFloat」に置き換えたことに注意してください):

- (void)layoutSubviews
{
    CGFloat x = [self contentOffset].x;
    for (UIView *view in rowHeaderViews) {
        [view setFrame:CGRectMake(x, view.frame.origin.y, view.frame.size.width, view.frame.size.height)];
    }
}
于 2012-10-15T17:47:34.507 に答える