7

過去 25 時間のイベントを表示するガントチャートを備えた小さな iPad アプリを開発しています。1 時間、30 分、15 分、5 分、1 分の 5 つのズーム レベルがあります。私のセルの幅は 30 ピクセルです。1 時間ごとの Zoomlevel から始めて、コンテンツの幅は 25 * 30 ピクセル = 750 です (まだスクロールする必要はありません)。セル幅を同じにズームすると、セルが増えるだけで、水平方向にスクロールできます。30分、15分、5分に最適です。1 分レベル (幅 45000 ピクセル (30 * 1500)) になると、問題が発生し始めます。スクロールビューがフリーズします (スクロールはできますが、表示は更新されません)。

drawRect: が実行されました (したがって、正しく描画されているはずです)。ボタンに小さなスクロールバーが表示されます (最後まで表示されます)。そこで幅に気をつけてみたところ、16300pix幅あたりから問題が発生しているようです。これに対する回避策はありますか?または任意の種類のソリューションですか?

drawRect: オーバーロードした uiview (Ganttchartview) を含む ScrollView を使用します。

CELL_WIDTH が 30 で、zoomLevels が 25、50、75、300、1500 のズームイン

 -(IBAction) zoomIn:(id)sender {
    self.zoomIndex++;
    int width = CELL_WIDTH * [[self.zoomLevels objectAtIndex: self.zoomIndex] intValue];
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, width, self.frame.size.height);
    [self.parentView setContentSize: CGSizeMake(self.frame.size.width, self.frame.size.height)];
    [self setNeedsDisplay];
}

線が描画される drawRect

- (void)drawRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextSetLineWidth(context, 2.0);        
    int interval = [[self.zoomLevels objectAtIndex: self.zoomIndex] intValue];
    int width = CELL_WIDTH;
    for (int i = 0; i < interval; i++) {
        CGContextMoveToPoint(context, width * (i +1), START_AT); 
        CGContextAddLineToPoint(context, width * (i +1), rect.size.height); 
        CGContextStrokePath(context);
    }
    for (int i = 0; i < NUMBER_OF_ROWS; i++) {
        CGContextMoveToPoint(context, 0, START_AT + i * CELL_WIDTH); 
        CGContextAddLineToPoint(context, rect.size.width, START_AT + i * CELL_WIDTH); 
        CGContextStrokePath(context);
    }
}
4

2 に答える 2

3

このような種類のアプリには、無限スクロール ビューの使用をお勧めします。これは、固定された (そして制限された) contentSize に基づいて、ユーザーに無限スクロールの経験を与えるコーディングのトリックにあります。良い例が WWDC 2011 で実証されているので、開発者アカウントを持っている場合はビデオをダウンロードできます (スクロール ビュー専用のセクションがありました)。または、Web でいくつかの例を参照することもできます。もちろん、利用可能なメモリをいっぱいにする可能性のあるコンテンツ全体ではなく、必要なコンテンツのみが読み込まれるようにコードをリファクタリングする必要があります。

于 2011-09-22T12:12:16.030 に答える
2

私が知る限りcontentSize、メモリが不足するまで、それがいっぱいになる最大値はありません。

水を入れることができるバケツと考えてください。ここの場合もそうです...

したがって、UITableView組み込みのメモリ管理が優れているため、使用することをお勧めします。

于 2011-09-22T12:01:47.170 に答える