有谁知道如何阻止UIWebView垂直反弹?我的意思是,当用户触摸其iPhone屏幕时,将其手指向下拖动,并且Webview在我加载的网页上方显示空白点吗?
我研究了以下可能的解决方案,但没有一个对我有用:
有谁知道如何阻止UIWebView垂直反弹?我的意思是,当用户触摸其iPhone屏幕时,将其手指向下拖动,并且Webview在我加载的网页上方显示空白点吗?
我研究了以下可能的解决方案,但没有一个对我有用:
Answers:
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;
同样适用WKWebView
。
UIWebView
以便可以[webView setBounces:NO]
在任何需要的地方打电话。
我当时正在研究一个项目,该项目可以很容易地在iPhone上将Web应用程序创建为完整的可安装应用程序,称为QuickConnect,并且找到了一个可行的解决方案,如果您根本不希望屏幕可滚动的话。我没有
在以上提到的project / blog帖子中,他们提到了您可以添加的javascript函数来关闭反弹功能,这实际上可以归结为:
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应用程序中使用该问题,则此问题的答案是Apple会拒绝的答案。
UIScrollView
是,UIWebView
这可能是目前的第一个子视图,但是在将来对iOS或特定配置进行的更新(即使是次要的更新)中,也很容易更改。您应该真正进行一次for
迭代subviews
才能真正找到它UIScrollView
(实际上并不需要那么多的工作,至少可以保证可以得到a UIScrollView
并且不会使您的程序崩溃……
在iOS 5 SDK中,您可以直接访问与Web视图关联的滚动视图,而无需遍历其子视图。
因此,要在滚动视图中禁用“弹跳”,可以使用:
myWebView.scrollView.bounces = NO;
请参见UIWebView类参考。
(但是,如果您需要支持5.0之前的SDK版本,则应遵循Mirek Rusin的建议。)
在Swift中禁用反弹
webViewObj.scrollView.bounces = false
布拉德的方法对我有用。如果使用它,则可能需要使其更加安全。
id scrollView = [yourWebView.subviews objectAtIndex:0]; if([scrollView responsesToSelector:@selector(setAllowsRubberBanding :)]) { [scrollView performSelector:@selector(setAllowsRubberBanding :) withObject:NO]; }
如果苹果改变了一些东西,那么反弹将重新出现-但至少您的应用程序不会崩溃。
仅在iOS5上,如果您计划让用户缩放Web视图的内容(即双击),则跳出设置是不够的。您还需要将alwaysBounceHorizontal和alwaysBounceVertical属性设置为NO,否则当它们缩小(另一个双击...)默认值时,它将再次反弹。
我遍历了UIWebView的子视图的集合,并将它们的背景设置为[UIColor blackColor],与网页背景的颜色相同。该视图仍会反弹,但不会显示难看的深灰色背景。
在我看来,UIWebView具有UIScrollView。您可以为此使用已记录的API,但是会为两个方向(而不是单独)设置跳动。这在API文档中。UIScrollView具有bounce属性,因此类似这样的工作(不知道是否有多个滚动视图):
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不是滚动视图,所以我做了一个自定义子类来获取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;
}
然后,当您创建自定义Web视图时,可以通过以下方式禁用跳动:
customWebView.scrollView.bounces = NO; //(or customWebView.scrollView.alwaysBounceVertically = NO)
这是一种使Web视图具有可自定义滚动行为的绝佳通用方法。只有几件事需要注意:
我尝试了一种稍微不同的方法来防止UIWebView对象滚动和弹跳:添加手势识别器以覆盖其他手势。
似乎,UIWebView或其滚动子视图使用其自己的平移手势识别器来检测用户的滚动。但是根据Apple的文档,有一种合法的方法可以将一个手势识别器替换为另一个。UIGestureRecognizerDelegate协议具有一个方法roleRecognizer:shouldRecognizeWithGestureRecognizer: -可以控制任何碰撞手势识别器的行为。
所以,我所做的是
在视图控制器的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;
}
当然,在实际的应用程序中,这种委托方法会使我更加复杂-我们可以有选择地禁用其他识别器,分析otherGestureRecognizer.view并根据其视图进行决策。
最后,为了完整起见,我们注册为平移处理程序的方法:
- (void)handlePanFrom:(UIPanGestureRecognizer *)recognizer
{
// do nothing as of yet
}
如果我们只想取消Web视图的滚动和弹跳,则可以为空;也可以包含我们自己的代码,以实现我们真正想要的平移运动和动画。
到目前为止,我只是在尝试所有这些东西,它似乎或多或少地发挥了我的作用。我还没有尝试将任何应用程序提交到iStore。但是我相信到目前为止我还没有使用过任何未记载的东西。如果有人发现它,请通知我。
这个链接对我帮助很大。。。很容易。有一个演示。
(Xcode 5 iOS 7 SDK示例)这是使用scrollview setBounces函数的通用应用程序示例。它是一个开源项目/示例,位于:链接到SimpleWebView(项目Zip和源代码示例)
的子视图之一UIWebView
应该是UIScrollView
。将其scrollEnabled
属性设置为NO
,Web视图将完全禁用滚动。
注意:从技术上讲,这是使用私有API的,因此您的应用可能会在以后的OS版本中被拒绝或崩溃。使用@try
和respondsToSelector
要禁用UIWebView
滚动,可以使用以下代码行:
[ObjWebview setUserInteractionEnabled:FALSE];
在此示例中,ObjWebview
类型为UIWebView
。