如何将 UIWebView 垂直滚动事件传输到父视图?

Posted

技术标签:

【中文标题】如何将 UIWebView 垂直滚动事件传输到父视图?【英文标题】:How to transmit a UIWebView vertical scroll event to the parent view? 【发布时间】:2013-12-23 07:25:02 【问题描述】:

我在我的UITableiViewCell 实例中添加了一个UIWebView 实例作为子视图,视图的层次结构如下:

UIView->UITableView->UITableiViewCell-> UIWebView

问题是当我在 web 视图中垂直滚动时,父 tableview 没有滚动!我不想设置UIWebView的属性userInteractionEnabled = NO,我只想在水平方向滚动我的网页视图。

你能帮帮我吗?

【问题讨论】:

【参考方案1】:

你应该正确设置contentSize的属性。

webView.scrollView.contentSize = CGSizeMake(PREDEFEINED_WIDTH, HEIGHT_OF_YOUR_TABLE_CELL);

【讨论】:

在 webview 滚动视图中触摸 contentsize 绝不是一个好主意。【参考方案2】:

您应该继承 UIWebView 并使用自定义委托将 scrollViewDidScroll 事件传递回您的父视图。

在 MyWebView.h 中

@protocol MyWebViewScrollDelegate <NSObject>
    -(void) webViewDidScroll:(UIWebView *)theWebView;
@end


@interface MyWebView : UIWebView
    @property (nonatomic, weak) id<MyWebViewScrollDelegate> scrollDelegate;
@end

在 MyWebView.m 中

@implementation MyWebView

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    [super scrollViewDidScroll:scrollView];
    if (_scrollDelegate && [_scrollDelegate respondsToSelector:@selector(webViewDidScroll:)]) 
        [_scrollDelegate webViewDidScroll:scrollView];


@end

然后在你的父视图中

MyWebView *v = [[MyWebView alloc]init];
v.scrollDelegate = self;

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
    //do whatever you want with the scrollview

【讨论】:

【参考方案3】:

如果您正在加载本地 html 文本,您可以使用以下代码禁用垂直滚动。

                         <html>
                         <head>
                         <style type=\"text/css\"> \n"
                         "body overflow-x: scroll;overflow-y: hidden;\n"
                         "</style>
                         </head>
                         <body>
                         //your content
                         </body>
                         </html>.

或者将 Webview 的框架大小设置为内容大小。根据 UIwebview Content Size 设置 UITableview 的框架有点困难。您仍然可以禁用 Scrollview 滚动。

 UIView * v = [[webView subviews] lastObject];
 if([v isKindOfClass:[UIScrollView class] ]) 
  if ([v respondsToSelector:@selector(setScrollEnabled]) 
    [v setScrollEnabled:NO];
  
  if ([v respondsToSelector:@selector(bounces)]) 
    [v bounces:NO];
  
 

【讨论】:

谢谢你的回答,我试过你的第一种方法,但是不行,第二种方法不是我想要的,因为我只想禁用垂直滚动。

以上是关于如何将 UIWebView 垂直滚动事件传输到父视图?的主要内容,如果未能解决你的问题,请参考以下文章

在 CSS flexbox 布局中,如果父级可垂直滚动,是不是有办法将子块高度锁定到父级(滚动)高度?

UISwipeGestureRecognizer 垂直于 UIWebView 滚动:如何避免对角滑动?

将触摸事件从 uiview 传输到 uiwebview

UIWebView 缩放问题

UIWebView 的 UIScrollView 子视图可以滚动但会弹回框架而不出现垂直滚动指示器

如何将滚动视图嵌入到表格视图中