カスタム描画ビューを保持する UIScrollView があります。描画ビューは、大きなコンテンツ (10000x10000 ピクセル) を描画するために使用されます。scrollview 内に巨大なビューを埋め込むことができないため (メモリの制限により)、scrollView のほぼ 2 倍のサイズのカスタム ビューを作成しました。StreetScroller [apple sample] ロジックを使用して同じものを実装しました。これは正常に機能しますが、タッチの識別に問題があります。ここから更新されたサンプルをダウンロードできますhttps://github.com/praveencastelino/SampleApps/tree/master/StreetScroller
scrollview の contentOffset は、中心から「X ピクセル」移動するたびに中心にリセットされるためです。したがって、scrollView のコンテンツ オフセットは、実際に必要なものとは異なります。これが scrollView で行うことです。
- (void)recenterIfNecessary
{
CGPoint currentOffset = [self contentOffset];
CGFloat contentHeight = [self contentSize].height;
CGFloat contentWidth = [self contentSize].width;
CGPoint centerOffset,distanceFromCenter;
centerOffset.y = (contentHeight - [self bounds].size.height) / 2.0;
distanceFromCenter.y = fabs(currentOffset.y - centerOffset.y);
centerOffset.x = (contentWidth - [self bounds].size.width) / 2.0;
distanceFromCenter.x = fabs(currentOffset.x - centerOffset.x);
if (distanceFromCenter.y > (contentHeight / 6.0))
{
self.contentOffset = CGPointMake(currentOffset.x, centerOffset.y);
[_labelContainerView didResetByVerticalDistancePoint:CGPointMake(currentOffset.x, centerOffset.y - currentOffset.y) visibleFrame:[self bounds]];
}
if (distanceFromCenter.x > (contentWidth / 6.0))
{
self.contentOffset = CGPointMake(centerOffset.x, currentOffset.y);
[_labelContainerView didResetByHorizontalDistancePoint: CGPointMake(centerOffset.x - currentOffset.x, currentOffset.y) visibleFrame:[self bounds]];
}
}
scrollview が中心をリセットするたびに、カスタム ビューに通知され、仮想コンテンツのオフセットが追跡されます。
-(void)didResetByVerticalDistancePoint:(CGPoint)distance visibleFrame:(CGRect)frame
{
_contentOffsetY += distance.y;
NSLog(@"_contentOffsetY %f",_contentOffsetY);
[self setNeedsDisplay];
}
ただし、スクロールビューがスクロールするたびに仮想コンテンツオフセットを計算したかった[現在、コンテンツオフセットは、スクロールビューのコンテンツオフセットを中央にリセットした場合にのみ計算されます]。これは最終的に、タッチの処理に役立ちます。
また、スクロールビューの境界が無限にスクロールしないように制限する方法が必要です。ユーザーがさらにスクロールしようとすると、コンテンツのみを表示し、スクロールを回避したい。