過去 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);
}
}