2014-04-19 57 views
2

我看了很多类似这样的问题,但尽量尝试,我不能让UIWebView以任何方式滚动或交互。下面是代码:为什么UIWebView不滚动?

- (void)loadView { 
    [super loadView]; 

    ... 

    [self.displayView loadHTMLString:entry->infoHtml baseURL:nil]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.displayView.userInteractionEnabled = YES; 
    self.displayView.scrollView.showsVerticalScrollIndicator = YES; 
    self.displayView.scrollView.scrollEnabled = YES; 
    [self.displayView.scrollView flashScrollIndicators]; 
} 

出现视图,显示了所有正确的内容,并且示出了垂直滚动条用于第二,正确地表示当前显示的内容的一部分。

但我不能滚动它。触摸内容并移动我的手指根本没有任何影响。与同一家长下不重叠的UITableView进行互动可以正常工作;触摸条目将更新UIWebView的内容,因为它已被编程。

的一个UIWebView在使用这些选项的故事板创建:

  • 尺度以适合:选中(选中时,不能捏到变焦,无论是)
  • 分页:unpaginated
  • 模式:方面适合(尝试了几种;所有未滚动)
  • UserInteractionEnabled:检查(父视图也有此检查)

该视图是完全可见的。我试图让它显着小于其父,并且显示的内容总是停在正确的位置。这个视图没有委托或手势识别器。

包含视图有一个UITableView和一个UILabel,它们都没有重叠UIWebView的区域。我试图改变故事板上场景中的视图顺序,但这也没有什么区别。

我试图去除UIBuilder视图和编程方式创建它像这样:

self.displayView = [[UIWebView alloc] initWithFrame:CGRectMake(400, 220, 400, 300)]; 
[self.view addSubview:self.displayView]; 

相同的结果。我尝试删除场景中的所有其他元素,除了这个以编程方式创建的UIWebView。仍然是相同的结果。

其他地方在我的代码,我已经把UIWebViewUIAlertView@"accessoryView"有预期我可以滚动的内容。

是否还有其他事情需要完成才能够滚动UIWebView子视图?

二零一四年四月二十零日:事实上,如果我下面的行添加到我的-loadView方法的底部,我得到了相同的HTML内容,因为它背后的窗口对话框,但我上午能够滚动对话框版本。我能想到的唯一区别是对话框是模态(强制焦点),而我自己的窗口同时使用UITableViewUIWebView仍允许与其后面的可见视图进行交互。

UIWebView* contents = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 250, 250)]; 
[contents loadHTMLString:entry->infoHtml baseURL:nil]; 
[alertView setValue:contents forKey:@"accessoryView"]; 
[alertView show]; 

在另一方面,如果我取代最后两行[self.view addSubview:contents];然后我得到在屏幕的左上角相同的第二HTML视图,但将滚动。

+0

奇怪!我添加UIWebView,它可以正常滚动。这个webView的内容太短了,导致你无法滚动。让我们尝试在另一个项目中添加UIWebView并进行测试。 – nmh

+0

如果您在移动Safari浏览器中运行,您是否验证过您尝试使用的HTML? – aeskreis

+0

我试过几种不同的HTML文件,所有这些文件在浏览器中都显示得很好。我的UIWebView似乎也喜欢它,并显示文件的顶部部分很好。我只是无法滚动它来查看以后的内容。如果我将字体缩小或“缩放到合适”,那么我还可以看到更多(或全部)文件。 –

回答

1

我已经完成了。首先,我想在我的MainController类中添加这-viewDidLoad

UIWebView* contents = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 250, 250)]; 
[contents loadHTMLString:@"<html><head><title>FOO</title></head><body><p>A</p><p>B</p><p>C</p><p>D</p><p>E</p><p>F</p><p>G</p><p>H</p><p>I</p><p>J</p><p>K</p><p>L</p><p>M</p><p>N</p><p>O</p><p>P</p><p>Q</p><p>R</p><p>S</p><p>T</p><p>U</p><p>V</p><p>W</p><p>X</p><p>Y</p><p>Z</p></body></html>" baseURL:nil]; 
contents.backgroundColor = [UIColor redColor]; 
[self.view addSubview:contents]; 

它显示却是不可滚动。我有一个StartupController处理初始化应用程序并首先运行,因此我在那里添加了相同的代码。 这是可滚动的!啊哈!

我想到覆盖MainView的顶级Google Map(GMSMapView)可能会吞服滚动事件,但会传递点击事件。在场景中,我创建了一个简单的/简单的/空的顶级简单的,而不是仅仅一个地图视图,并且使GMSMapView成为一个完整的小孩。现在,当我将视图添加到新的顶层(简单)视图时,它们是兄弟姐妹而不是地图的子节点,并正确地获取所有事件。

结果,我UIWebView现在是滚动的。感谢大家的意见和建议!经过几个月的不断尝试不同的事情才终于找到了答案。

+0

如果有人知道如何使用XCode追踪*事件,请告诉我。也许那时我可以很快看到吞噬滚动事件的东西。 –

0

请检查Web视图包含完全其父视图的边界(依此类推,直到视图层次结构)内。一个简单的方法是设置一些背景颜色。可能你有一些不符合你期望的约束。

同样,所有的家长意见是启用用户交互。

编辑:据我了解,Web视图是完全可见。但这并不意味着它被包含在其超级视图的界限内。如果超级视图的clipsToBounds = NO(默认,我相信),那么任何超出其边界的子视图将是可见的,但不会接受触摸。

+0

我在我的问题中明确表示该视图完全可见。我试图用多种方式展示它,包括通过故事板和编程方式,以各种大小和边界。我还指出,在父视图中启用了用户交互,后者由相邻的UITableView接受触摸事件展示。 –

+0

我明白了 - 我看到了。但是,如果子视图包含在其父级的边界之外(并且clipsToBounds = NO,默认...),则子视图可能是完全可见的(但不会接收触摸)。我会用这些信息更新我的答案。感谢downvote。 – TomSwift