防止uiscrollview进一步滚动到某一点

时间:2011-11-17 10:53:57

标签: objective-c ios uiscrollview

我有一个UIScrollView,其子视图可以创建宽度约为7000的内容。 现在我希望UIScrollView不再滚动2000。

我试过了:

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

但我仍然可以滚动到最后,我该如何防止这种情况?

7 个答案:

答案 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%;