gpt4 book ai didi

ios - UIWebView 将垂直滚动事件委托(delegate)给父级,如果滚动到顶部或底部

转载 作者:可可西里 更新时间:2023-11-01 05:02:29 25 4
gpt4 key购买 nike

我在 UIScrollView 中有一个 UIWebView,它是分页的。基本上我想用滚动/滑动手势在不同的 webview 之间切换。水平它工作正常。如果 webview 滚动到“页面的边界”,滚动/平移事件将传递给 scrollview,以便显示下一页。在垂直轴上,这不起作用。似乎没有传递给 ScrollView 的事件。这可能是弹跳的问题,我禁用了它,因为我认为它会消耗事件。但即使禁用弹跳,这也不起作用。

我之前在 ScrollView 中使用 TextViews 对此进行了测试,它也有效。可能是 webview 的特殊行为。

任何想法,我如何让它工作?我是否必须实现事件监听器并将事件手动传递给 ScrollView ?

此外,如果您对如何实现这种布局有更好的想法,请告诉我。正如我所说,我想要一个不同 View 的网格,可以通过滑动/滚动手势进行更改。类似于AppStore应用,应用详情可以垂直滚动,屏幕截图可以水平滚动。

干杯亨里克

最佳答案

所以,我想通了。

首先我设置了 webview 的委托(delegate),这样我就可以获得滚动事件并可以检查 webview 是滚动到顶部还是底部:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if([scrollView isEqual:webView.scrollView]) {
float contentHeight = scrollView.contentSize.height;
float height = scrollView.frame.size.height;
float offset = scrollView.contentOffset.y;

if(offset == 0) {
webViewScrolledToTop = true;
webViewScrolledToBottom = false;
} else if(height + offset == contentHeight) {
webViewScrolledToTop = false;
webViewScrolledToBottom = true;
} else {
webViewScrolledToTop = false;
webViewScrolledToBottom = false;
}

//NSLog(@"Webview is at top: %i or at bottom: %i", webViewScrolledToTop, webViewScrolledToBottom);
}
}

然后我在 webview 的 ScrollView 中注册了额外的滑动手势识别器:

swipeUp = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeUp)];
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
swipeUp.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeUp];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp];
swipeDown = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeDown)];
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
swipeDown.delegate = self;
[self.webView.scrollView addGestureRecognizer:swipeDown];
[self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeDown];

注意对 [self.webView.scrollView.panGestureRecognizer requireGestureRecognizerToFail:swipeUp]; 的调用。这些是绝对必要的,因为没有它们,webview 的平移手势识别器总是会在事件到达滑动手势识别器之前消耗事件。这些调用改变了优先级。

在 swipeUp 和 swipeDown 方法中,我计算下一个“页面”的位置并将父 ScrollView 滚动到该位置,如果确实有下一页的话。

最后一件事是检查 webview 是否滚动到顶部或底部,并且只接受这种情况下的手势。因此,您必须实现手势识别器的委托(delegate):

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if(gestureRecognizer == swipeUp) {
return webViewScrolledToBottom;
} else if(gestureRecognizer == swipeDown) {
return webViewScrolledToTop;
}

return false;
}

您可能还必须禁用滚动弹跳才能使其适用于非常小以至于根本不滚动的网页:webView.scrollView.bounces = false;

关于ios - UIWebView 将垂直滚动事件委托(delegate)给父级,如果滚动到顶部或底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10833333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com