我有一个UIScrollView,它包含一个自定义图纸视图。绘图视图用于绘制大内容(10000x10000像素)。由于我无法在scrollview [内存限制]中嵌入大量视图,因此我创建了一个自定义视图,其大小几乎是scrollView的两倍。我使用了StreetScroller [apple sample]逻辑来实现相同的功能。这很好但是识别触摸有问题。您可以从此处下载更新的示例https://github.com/praveencastelino/SampleApps/tree/master/StreetScroller
因为每当滚动视图的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];
}
但是,我想在滚动视图滚动时计算虚拟内容偏移量[目前仅在我们将scrollview的内容偏移重置为中心时计算内容偏移量]。这最终会帮助我处理触摸。
另外,我需要一种方法来限制scrollview的边界无限滚动。我想只显示内容并避免滚动,如果用户试图进一步滚动它。