我有一个 UIScrollView ,它包含一个自定义绘图视图。绘图视图用于绘制大型内容(10000x10000 像素)。由于我无法在滚动视图中嵌入巨大的视图[由于内存限制],因此我创建了一个几乎是滚动视图大小两倍的自定义视图。我已经使用 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]];
}
}
每当滚动视图重置中心时,自定义视图都会通知并跟踪虚拟内容偏移量。
-(void)didResetByVerticalDistancePoint:(CGPoint)distance visibleFrame:(CGRect)frame
{
_contentOffsetY += distance.y;
NSLog(@"_contentOffsetY %f",_contentOffsetY);
[self setNeedsDisplay];
}
但是,我想在滚动视图滚动时计算虚拟内容偏移量[目前仅当我们将滚动视图的内容偏移量重置为中心时才计算内容偏移量]。这最终将帮助我处理触摸。
另外,我需要一种方法来限制滚动视图的边界无限滚动。如果用户尝试进一步滚动,我只想显示内容并避免滚动。