使用窥视邻居页面分页UIScrollView

问题描述 投票:10回答:3

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

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

那他们怎么做到的呢?

iphone cocoa-touch uiscrollview
3个回答
18
投票

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

Objective-C的

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

Swift 4.0

override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
    return self.bounds.contains(point) ? self.scrollView : super.hitTest(point, with: event)
}

1
投票

我没有足够高的排名来评论上面的答案,但你可以在Ray Wenderlich的网站上找到一个教程和示例代码:How To Use UIScrollView to Scroll and Zoom Content

此代码使用上面列出的技术,特别是命中测试逻辑。


0
投票

如果您希望内容在界限之外保持交互,请不要忘记将触摸转发到scrollview子视图。

如果您将scrollview内容放在一个额外的容器中,则以下示例为true。如果不是这种情况,则循环遍历子视图并返回被触摸命中的那个。

- (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event 
{
    UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil;
    return [contentView hitTest:pt withEvent:event];
}
© www.soinside.com 2019 - 2024. All rights reserved.