防止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%;