防止uiscrollview进一步滚动然后确定点

我有一个UIScrollView有子视图创build一个约7000的宽度的内容。现在我想UIScrollView不滚动任何进一步2000年。

我试过了:

[scrollView setContentSize:CGSizeMake(768.0, 2000.0)]; [scrollView setClipsToBounds:YES]; 

但是我仍然可以滚动到最后,我该如何预防呢?

似乎webView正在更改页面加载后的scrollView contentSize

在你的init中设置自己作为WebView的委托:

 [webView setDelegate: self]; 

并添加这个方法:

 - (void)webViewDidFinishLoad: (UIWebView *)webView { [webView.scrollView setContentSize: CGSizeMake(768.0, 2000.0)]; } 

在我的testing案例中,它工作正常。


更新:

调用javascript方法有时不会触发webViewDidFinishLoad 。 所以最普遍的技术将是键值观测。

在init:

 [webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil]; 

而某处这个方法:

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { UIScrollView * scrlView = (UIScrollView *) object; if ([keyPath isEqual:@"contentSize"]) { NSLog(@"New contentSize: %fx %f",scrlView.contentSize.width,scrlView.contentSize.height); if(scrlView.contentSize.width!=768.0||scrlView.contentSize.height!=2000.0) [scrlView setContentSize:CGSizeMake(768.0, 2000.0)]; } } 

在dealloc的情况下,不要忘记删除观察者:

 [webView.scrollView removeObserver:self forKeyPath:@"contentSize"]; 

如果内容偏移超过2000,则可以将内容偏移设置为2000,这样就不会超出界限。

实现此方法并将其设置为该滚动视图的委托

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.x > 2000) { CGPoint offset = scrollView.contentOffset; offset.x = 2000; [scrollView setContentOffset:offset animated:YES]; } } 

编辑:我只是试过这个,它工作正常。 也许检查为什么setContentSize:不工作? 另一种方法,用2000年的高度做一个视图,把你的内容视图放到它里面,然后把这个视图作为scrollview的子视图。

 UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 600, 7000)]; label.numberOfLines = 60; label.font = [UIFont systemFontOfSize:100]; UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame]; NSMutableString *str = [[NSMutableString alloc] initWithCapacity:300]; for (int i = 0; i < 60; i++) [str appendFormat:@"%d\n", i]; label.text = str; [scrollView addSubview:label]; [scrollView setContentSize:CGSizeMake(600, 2000)]; [self.view addSubview:scrollView]; 

我相信你上面的代码应该可以正常工作。 setContentSize将防止contentOffset变大。 但是,如果用户已经在该区域之外滚动,则可能必须自己设置contentOffset(一次)。 (尝试将其重置为(0,0))。

另外,你是否允许缩放? 如果您有一个缩放!= 1,内容大小可能不是你认为它是。 在修改内容大小之前,尝试将缩放设置为1。

好所以,第一步,你的视图控制器必须实现UISCrollViewDelegate,你必须设置你的控制器作为你的UIScrollView的委托。

然后,在你的控制器中实现这个委托方法:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { static float stopx = 2000.0f; if (scrollView.contentOffset.x >= stopx) { CGPoint stop = scrollView.contentOffset; stop.x = stopx; [scrollView setContentOffset:stop animated:NO]; } } 

任何时候你得到通过2000 /停止值,滚动视图应该带回来

正如其他人所说,实施uiscrollviewdelegate

实施这些方法:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 

希望能够解决你遇到的跳跃问题

注意,把这些方法放到类似的其他post中就好

 static float stopx = 2000.0f; if (scrollView.contentOffset.x >= stopx) { CGPoint stop = scrollView.contentOffset; stop.x = stopx; [scrollView setContentOffset:stop animated:NO]; } 

起初的performance可能会受到损害,如果这是真的,开始拿出某些委托方法,直到你得到所需的行为

除非我误解了你的问题,否则这很简单。 将其添加到包含Web视图的视图控制器。

 - (void)viewDidLoad { // other stuff self.webView.delegate = self; self.webView.scrollView.bounces = YES; // load your webView here } - (void)webViewDidFinishLoad:(UIWebView *)webView { CGSize contentSize = self.webView.scrollView.contentSize; CGFloat maxContentWidth = contentSize.width; if (maxContentWidth > 2000) { maxContentWidth = 2000; } self.webView.scrollView.contentSize = CGSizeMake(maxContentWidth, contentSize.height); } 

很难给出具体的答案没有看到你的HTML,但我有过类似的问题,我认为它实际上是你的UIWebview滚动,而不是滚动视图。 在UIWebview HTML的页面某处,你可能会有超大的内容。 webview自然要滚动。 就我而言,这是一段文字中的长URL。 我也看到了这种情况。

你需要find容器元素到超大的html,并设置溢出隐藏在CSS中。 这可能是这是html中的body标签或html标签,或者你需要包装你的内容。

即;

 <div style="overflow:hidden"> Overflowing text </div> 

否则,你可能不得不玩下面的标签

或者将容器div设置为宽度:100%&height:100%;