Disable Scroll on a UIWebView allowed?

IosScrollUiwebview

Ios Problem Overview


I have to show a web article with a UITableView under the article.

The only option I found was to display the article in a UIWebView in the tableView header.

In order to do that I have to get the height of the webView content and I have to disable scrolling for the webView.

I found two solutions to disable scrolling:

for (id subview in webView.subviews)
    if ([[subview class] isSubclassOfClass: [UIScrollView class]])
        ((UIScrollView *)subview).scrollEnabled=NO;

or in JavaScript:

<script type="text/javascript">
touchMove = function(event) {
    event.preventDefault();
}

I heard that the first solution is forbidden by Apple but I don't have any proof of it. Will my application be rejected by using this solution? If so, can I use the second solution without being rejected?

Ios Solutions


Solution 1 - Ios

Starting with iOS5 we have direct access to the scrollview of the UIWebView.
You can disable scrolling and bounces like this:

webView.scrollView.scrollEnabled = NO; 
webView.scrollView.bounces = NO;

Solution 2 - Ios

Since this question is still applicable, there is a new way to do it! (iOS 7.0+, perhaps iOS 6 also, not confirmed)

webView.scrollView.scrollEnabled = NO;

Take care :)

Solution 3 - Ios

You can simply set the web view user interaction property to no i.e.

webView.userInteractionEnabled = NO;

Its pretty simple and works fine,thanks :)

Solution 4 - Ios

for all ios versions you can use this code instead of setScrollEnabled :

for (UIView *view in webview.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
       UIScrollView *scrollView = (UIScrollView *)view;
       scrollView.scrollEnabled = NO;
    }
}

Solution 5 - Ios

Use this one <body ontouchmove="event.preventDefault()">

Solution 6 - Ios

SWIFT 3 version

    webView.scrollView.bounces = false
    webView.scrollView.isScrollEnabled = false

Solution 7 - Ios

I think the Javascript

<script type="text/javascript">
touchMove = function(event) {
event.preventDefault();
}

is far the best solution.

Indeed :

Your first examle, or the

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

one (same things) could be rejected because not documented, or make you app crash in a further ios update.

And the

[[myWebView scrollView] setBounces:NO];

method won't work with iOS < 5.

Solution 8 - Ios

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

that sorted it for me

Solution 9 - Ios

The first is rejected by Apple. It happened to me just this morning.

Solution 10 - Ios

[[myWebView scrollView] setBounces:NO];

Solution 11 - Ios

I don't think the first option is forbidden by Apple.

You could try

[[[Webview subviews] lastObject] setScrollingEnabled:NO];

If you don't want any links to work in your UIWebView, you can also do

[myWebView setUserInteractionEnabled:NO];

Solution 12 - Ios

Use it :

[[webView scrollView] setBounces:NO];
[[webView scrollView] setScrollingEnabled:NO];

Solution 13 - Ios

Try this,

[(UIScrollView *)[[webView subviews] lastObject] setScrollEnabled:NO];    

Solution 14 - Ios

I placed some UIWebViews inside a UIScrollView and it wasn't scrolling for me, unless I disable the user interaction on the webviews (even with the [[webview scrollview] setScrollEnabled:NO]). So I placed the UIWebViews inside a UIView and that worked for me but then the interactive links or divs in my HTML inside the UIWebView were not working anymore.

The only thing that worked for me is to keep the UIWebView inside the UIScrollView so the HTML interactions work but the UIScrolling does not.

I then created a custom delegate for the webviews to listen for window.open("http:/customEvent") that is called from the HTML contained in the webview. I also added a JavaScript swipe detection that will fire up my custom event.

When the webview delegate receives this, I pass a notification to a controller which then dynamically scrolls my UIScrollView. Obviously I had to build a logic to monitor and scroll to the next or previous page. Not the prettiest solution but It's working for me.

Solution 15 - Ios

Try this in your HTML (<HEAD> tag)

<script> 
  document.ontouchmove = function(event) { event.preventDefault(); }
</script>

It will disable scrolling on your web page.

(works on any webpage, not just UIWebView)

Solution 16 - Ios

I needed to disable scrolling because dismissing a custom keyboard really messed up scrolling with the webView. Nothing else worked and I resorted to something like this:

-(void)viewDidLoad{
  [super viewDidLoad];
  [self.webView.scrollView addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:nil];
  self.webView.scrollView.showsVerticalScrollIndicator = NO;
}  

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if (!CGPointEqualToPoint(self.webView.scrollView.contentOffset, CGPointZero)){
        self.contentOffset = CGPointZero;
    }
}

Solution 17 - Ios

Is a UIWebview and a UITableView on a UIScrollview, and setting the height of the webview (and adding to the total ContentSize of the Scrollview) like what you want?

Solution 18 - Ios

[[[WebView subviews] lastObject] setScrollingEnabled:NO];

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionjsaddourView Question on Stackoverflow
Solution 1 - IosAlex StanciuView Answer on Stackoverflow
Solution 2 - IosRyan CopleyView Answer on Stackoverflow
Solution 3 - IosEshwar ChaitanyaView Answer on Stackoverflow
Solution 4 - Iosmturhan55View Answer on Stackoverflow
Solution 5 - IosGobi MView Answer on Stackoverflow
Solution 6 - IosAhmed SafadiView Answer on Stackoverflow
Solution 7 - IosMartinView Answer on Stackoverflow
Solution 8 - IostheiOSDudeView Answer on Stackoverflow
Solution 9 - IosJane SalesView Answer on Stackoverflow
Solution 10 - IosmafonyaView Answer on Stackoverflow
Solution 11 - IosNick BullView Answer on Stackoverflow
Solution 12 - IosPawel MolodkinView Answer on Stackoverflow
Solution 13 - IosShanmugaraja GView Answer on Stackoverflow
Solution 14 - IosMarkView Answer on Stackoverflow
Solution 15 - IosGikView Answer on Stackoverflow
Solution 16 - IosakiraspeirsView Answer on Stackoverflow
Solution 17 - IosHenrik ErlandssonView Answer on Stackoverflow
Solution 18 - Iosimran ahmedView Answer on Stackoverflow