停止UIWebView从“反弹”垂直?
有谁知道如何停止从垂直弹跳UIWebView? 我的意思是当用户触摸他们的iphone屏幕,向下拖动他们的手指,webview显示在我已经加载的网页上方的空白处?
我已经看过以下可能的解决scheme,但是他们都没有为我工作:
http://www.iphonedevsdk.com/forum/iphone-sdk-development/996-turn-off-scrolling-bounces-uiwebview.html
http://forums.macrumors.com/showthread.php?t=619534
如何阻止UIScrollView水平弹跳?
for (id subview in webView.subviews) if ([[subview class] isSubclassOfClass: [UIScrollView class]]) ((UIScrollView *)subview).bounces = NO;
…似乎工作正常。
它也会被App Store所接受。
更新 :在iOS 5.x +有一个更简单的方法 – UIWebView
具有scrollView
属性,所以你的代码可以像这样:
webView.scrollView.bounces = NO;
我正在寻找一个项目,可以很容易地创buildWeb应用程序作为iPhone上完全成熟的可安装应用程序QuickConnect ,并find了一个解决scheme,如果你不希望你的屏幕是可滚动的,在我的情况我没有。
在上面提到的项目/博客文章中,他们提到了一个JavaScript函数,您可以添加closures弹跳,基本归结为:
document.ontouchmove = function(event){ event.preventDefault(); }
如果你想了解更多关于他们如何实现它,只需下载QuickConnect,并检查出来….但基本上所有它所做的就是调用页面加载的JavaScript …我试着把它放在我的文档的头,它似乎工作正常。
那么我所做的就是:
UIView *firstView = [webView.subviews firstObject]; if ([firstView isKindOfClass:[UIScrollView class]]) { UIScrollView *scroll = (UIScrollView*)firstView; [scroll setScrollEnabled:NO]; //to stop scrolling completely [scroll setBounces:NO]; //to stop bouncing }
对我来说工作得很好…另外,这个问题的答案是苹果将拒绝,如果你在你的iPhone应用程序中使用它。
在iOS 5 SDK中,您可以直接访问与Web视图关联的滚动视图,而不是迭代其子视图。
因此,要禁用滚动视图中的“弹跳”,您可以使用:
myWebView.scrollView.bounces = NO;
请参阅UIWebView类参考 。
(但是,如果您需要在5.0之前支持SDK的版本,则应遵循Mirek Rusin的build议 。)
警告。 我使用了setAllowsRubberBanding:在我的应用程序中,Apple拒绝了它,声明不允许使用非公共API函数(引用:3.3.1)
Swift 3
webView.scrollView.bounces = false
在Swift中禁用反弹
webViewObj.scrollView.bounces = false
布拉德的方法为我工作。 如果你使用它,你可能想要使它更安全一些。
id scrollView = [yourWebView.subviews objectAtIndex:0]; 如果([scrollView respondsToSelector:@selector(setAllowsRubberBanding :)]) { [scrollView performSelector:@selector(setAllowsRubberBanding :) withObject:NO]; }
如果苹果改变了一些东西,那么反弹会回来 – 但至less你的应用程序不会崩溃。
在iOS5上,只有当您计划让用户放大webview内容(ei:双击)时,反弹设置是不够的。 你需要设置alwaysBounceHorizontal和alwaysBounceVertical属性为NO,否则当他们缩小(另一个双击…)默认情况下,它会再次反弹。
我遍历了UIWebView的子视图集合,并将其背景设置为[UIColor blackColor],与网页背景颜色相同。 视图仍然会反弹,但不会显示丑陋的深灰色背景。
我恼火地发现,UIWebView不是一个滚动视图,所以我做了一个自定义的子类来获取在Web视图的滚动视图。 这个suclass包含一个滚动视图,所以你可以自定义你的web视图的行为。 这堂课的重点是:
@class CustomWebView : UIWebview ... - (id) initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; // WebViews are subclass of NSObject and not UIScrollView and therefore don't allow customization. // However, a UIWebView is a UIScrollViewDelegate, so it must CONTAIN a ScrollView somewhere. // To use a web view like a scroll view, let's traverse the view hierarchy to find the scroll view inside the web view. for (UIView* v in self.subviews){ if ([v isKindOfClass:[UIScrollView class]]){ _scrollView = (UIScrollView*)v; break; } } return self;
}
然后,当您创build自定义网页视图时,您可以禁用弹跳:
customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)
这是一个伟大的通用目的的方式来使网页视图与可定制的滚动行为。 有几件事值得注意:
- 与任何视图一样,您还需要重写 – (id)initWithCoder:如果您在Interface Builder中使用它
- 当您最初创buildWeb视图时,其内容大小始终与视图框架的大小相同。 在滚动网页后,内容大小代表视图内实际网页内容的大小。 为了解决这个问题,我做了一些hacky – 调用-setContentOffset:CGPointMake(0,1)animation:YES强制一个不明显的变化,它将设置Web视图的正确内容大小。
遇到这个寻找答案,我最终只是幸运地回答了我自己的答案。 我做了
[[webview scrollView] setBounces:NO];
它的工作。
这工作对我来说,也很漂亮(我使用webView的phonegap)
[[webView.webView scrollView] setScrollEnabled:NO];
要么
[[webView scrollView] setScrollEnabled:NO];
它看起来像UIWebView有一个UIScrollView。 你可以使用logging的API来实现这个function,但是为两个方向而不是单独设置弹跳。 这是在API文档中。 UIScrollView有一个反弹属性,所以这样的工作(不知道是否有多个滚动视图):
NSArray *subviews = myWebView.subviews; NSObject *obj = nil; int i = 0; for (; i < subviews.count ; i++) { obj = [subviews objectAtIndex:i]; if([[obj class] isSubclassOfClass:[UIScrollView class]] == YES) { ((UIScrollView*)obj).bounces = NO; } }
我尝试了一个稍微不同的方法来防止UIWebView对象滚动和弹跳:添加手势识别器来覆盖其他手势。
看来, UIWebView或其滚动子视图使用自己的平移手势识别器来检测用户滚动。 但根据苹果公司的文件,有一种合法的方式是将一个手势识别器与另一个手势识别器重写。 UIGestureRecognizerDelegate协议有一个方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: – 它允许控制任何碰撞手势识别器的行为。
所以,我做的是
在视图控制器的viewDidLoad方法中:
// Install a pan gesture recognizer // We ignore all the touches except the first and try to prevent other pan gestures // by registering this object as the recognizer's delegate UIPanGestureRecognizer *recognizer; recognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanFrom:)]; recognizer.delegate = self; recognizer.maximumNumberOfTouches = 1; [self.view addGestureRecognizer:recognizer]; self.panGestureFixer = recognizer; [recognizer release];
那么,手势重写方法:
// Control gestures precedence - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { // Prevent all panning gestures (which do nothing but scroll webViews, something we want to disable in // the most painless way) if ([otherGestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) { // Just disable every other pan gesture recognizer right away otherGestureRecognizer.enabled = FALSE; } return NO; }
当然,这种委托方法在实际应用中可能更加复杂 – 我们可能会有select地禁用其他识别器,分析其他的GlanceRecognizer.view ,并根据它是什么样的观点作出决定。
最后,为了完整起见,我们注册为泛处理程序的方法:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer { // do nothing as of yet }
它可以是空的,如果我们想要的是取消networking视图的滚动和反弹,或者它可以包含我们自己的代码来实现我们真正想要的那种平移animation和animation…
到目前为止,我只是试验所有这些东西,而且似乎正在或多或less的工作,因为我想要它。 尽pipe如此,我还没有尝试将任何应用程序提交给iStore。 但是我相信我迄今还没有使用过任何没有logging的东西…如果有人发现它,请告诉我。
这里有两个较新的潜在解决scheme。 显然,你可以使用jqtouch或pastrykit禁用滚动。 但是,我没有得到这些工作。 你可能更有能力。
closures垂直滚动
挖入糕点套餐
固定在移动Safari上的定位
这个链接帮了我很多…..简单..有一个演示..
(Xcode 5 iOS 7 SDK示例)以下是使用滚动视图setBounces函数的通用应用程序示例。 这是一个开源项目/例子在这里: 链接到SimpleWebView(项目邮编和源代码示例)
UIWebView
的子视图之一应该是一个UIScrollView
。 将其scrollEnabled
属性设置为NO
,Web视图将完全禁用滚动。
注意:这在技术上使用私人API,因此您的应用程序可能会在未来的操作系统版本中被拒绝或崩溃。 使用@try
和respondsToSelector
看看UIScrollView
的bounces
属性。 苹果公司的文档:
如果该属性的值为
YES
(默认值),则滚动视图在遇到内容的边界时会popup。 从视觉上反弹表明滚动已达到内容的边缘。 如果该值为“NO
,则滚动立即在内容边界处停止而不弹跳。
确保你使用的是正确的UIScrollView
。 我不确定UIWebView
的层次结构是什么样子,但滚动视图可以是UIWebView
的父级而不是子级。
要禁用UIWebView
滚动,您可以使用以下代码行:
[ObjWebview setUserInteractionEnabled:FALSE];
在这个例子中, ObjWebview
的types是UIWebView
。
webView.scrollView.scrollEnabled = NO; webView.scrollView.bounces = NO;