我有一个UIScrollView,其子视图可以创建宽度约为7000的内容。 现在我希望UIScrollView不再滚动2000。
我试过了:
[scrollView setContentSize:CGSizeMake(768.0, 2000.0)];
[scrollView setClipsToBounds:YES];
但我仍然可以滚动到最后,我该如何防止这种情况?
答案 0 :(得分:7)
似乎webView
在页面加载后正在更改其scrollView
contentSize
。
在你的init set self中担任{{1}}的代表:
WebView
并添加此方法:
[webView setDelegate: self];
在我的测试用例中,它运行正常。
更新:
调用javascript方法有时不会触发- (void)webViewDidFinishLoad: (UIWebView *)webView {
[webView.scrollView setContentSize: CGSizeMake(768.0, 2000.0)];
}
。因此,最普遍的技术将是Key-Value Observing。
在init中:
webViewDidFinishLoad
在某处这个方法:
[webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];
如果是dealloc,请不要忘记删除观察者:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
UIScrollView * scrlView = (UIScrollView *) object;
if ([keyPath isEqual:@"contentSize"]) {
NSLog(@"New contentSize: %f x %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)];
}
}
答案 1 :(得分:1)
如果内容偏移超过2000,则可以将内容偏移设置为2000,因此不会超出限制范围。
实现此方法并将其设置为该scrollview的委托
- (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];
答案 2 :(得分:0)
我相信上面的代码应该可以正常工作。 setContentSize将阻止contentOffset变大。但是,如果用户已经在该区域之外滚动,则可能必须自己设置contentOffset(一次)。 (例如,尝试将其重置为(0,0)。)
另外,你允许缩放吗?如果你有缩放!= 1,内容大小可能不是你想象的那样。在修改内容大小之前,请尝试将缩放设置为1.
答案 3 :(得分:0)
好 首先,您的视图控制器必须实现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 / stop值的传递,都应该将滚动视图带回来
答案 4 :(得分:0)
正如其他人所说,实施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
希望这能解决您遇到的跳跃问题
请注意,将这些方法与其他帖子类似的代码放在中static float stopx = 2000.0f;
if (scrollView.contentOffset.x >= stopx) {
CGPoint stop = scrollView.contentOffset;
stop.x = stopx;
[scrollView setContentOffset:stop animated:NO];
}
首先,性能可能会受到影响,如果这是真的,开始取出某些委托方法,直到你得到所需的行为
答案 5 :(得分:0)
除非我在你的问题中误解了某些内容,否则这很简单。将其添加到包含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);
}
答案 6 :(得分:0)
很难在没有看到你的HTML的情况下给出具体的答案,但我之前遇到过类似的问题,我认为它实际上是你的UIWebview实际上是滚动而不是滚动视图。在UIWebview html页面的某个地方,你很可能会有超大的内容。 webview自然想要滚动。就我而言,它是一段文字中的长URL。我也看到过这种情况在垂直发生。
您需要在超大html中找到容器元素,并将溢出设置为隐藏在css中。这可能是html中的body标签或html标签,或者你需要包装你的内容。
即;
<div style="overflow:hidden">
Overflowing text
</div>
如果不通,您可能需要使用以下标签
或者将容器div设置为宽度:100%&amp;高度:100%;