2010-09-17 49 views
10

查看iPhone或iPad上的App Store应用程序,特别是显示屏幕截图的应用程序详细信息屏幕上的应用程序。屏幕截图查看器会显示您正在查看的屏幕截图以及下一个和上一个屏幕的边缘。我需要实现类似的东西。通过查看邻居页面来查看UIScrollView

我如何做到这一点对穷人来说是公平的:我构建了一个UIScrollView并启用了分页并且布置了我的内容。我使框架与内容页面大小相同,但比屏幕小。然后我禁用了clipToBounds,所以ScrollView的框架之外的东西仍然被绘制。现在我可以看到相邻页面的边缘,但它们不在ScrollView中,因此无法接收滚动触摸。 App Store应用程序可让您触摸该事物的整个宽度,包括相邻页面的窥视边缘。

那他们怎么做到的?

回答

17

您需要在滚动视图的'后面'添加一个视图,该视图覆盖了您的页面可见的整个区域。这个视图应该实现-hitTest:withEvent :.该方法将被操作系统调用以确定在哪里路由特定的触摸事件。所有你需要做的就是回到你的滚动视图这个后盾视图中的任何点:

- (UIView *) hitTest: (CGPoint) pt withEvent: (UIEvent *) event { 
    if (CGRectContainsPoint(self.bounds, pt)) return self.scrollView; 
    return [super hitTest: pt withEvent: event]; 
} 
+0

我简直不敢相信!在我可以尝试一两天之前(我的客户部分计划不好,事实上,这实际上构成了我的一部分紧急事件,事实证明),但我会临时给你检查。干杯! – 2010-09-17 14:16:29

+0

非常感谢这个答案,本!这确实很好。 – 2010-12-13 15:28:10

+3

我也尝试了上面的解决方案,但发现滚动视图中的项目本身不再接收触摸事件 - 只有滚动视图。这是预期的行为? – 2010-12-14 10:39:30

0

不要忘了,如果你想你的内容范围之外留互动的触摸转发给了滚动子视图。

如果您已将滚动视图内容放入额外的容器中,则以下示例为true。如果情况并非如此,则循环播放子视图并返回被触摸命中的那个。

- (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event 
{ 
    UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil; 
    return [contentView hitTest:pt withEvent:event]; 
} 
+1

我试过这个,但UIScrollView的hittest方法永远不会被调用。你如何做你的视图层次? – htafoya 2012-12-04 03:54:18