6

我有两个带有 PagingEnabled 的水平 UIScrollView。在此处输入图像描述

在纵向模式下,一切正常,但在横向模式下,滚动视图之间出现冲突。例如,如果当前可见视图是 ScrollView2.View2 并且我正在滚动到 ScrollView1.View3,则 ScrollView2 滚动以及 ScrollView1。它以某种方式接收 ScrollView1 的滚动事件。结果我得到的 ScrollView2.contentOffset 等于 0.0(但它应该等于 View2 的 X,例如 384.0)。

是否可以确定哪个滚动条正在滚动?我尝试使用 UIScrollViewDelegate 方法进行修复,但没有帮助我,如果我使用 WebViews 而不是 Views,情况会变得更糟。

编辑:我在 github 添加了一个小样本

正如我之前提到的,我尝试在“didScroll”和其他委托方法中检查滚动视图的实例,但是在这些方法中同步所有内容并不容易。我试图覆盖 hitTest 方法,也没有帮助我。

4

2 回答 2

0

scrollViewDidScroll:

当用户在接收器中滚动内容视图时告诉代理。

  • (void)scrollViewDidScroll:(UIScrollView *)scrollView

这样的事情有什么问题?

-(void)scrollViewDidScroll:(UIScrollView*)scrollView
{
    if(scrollView == ScrollView2)
    {
        // do stuff
    }
}
于 2013-11-04T16:37:07.367 回答
0

我还没有找到将事件传递给正确滚动视图的方法。但这里有一些让它起作用的东西:

首先,您需要在所有嵌套的 UIScrollView 中禁用 Paging Enabled(因为嵌套的 UIScrollView 将与父 UIScrollView 一起滚动)。

实现嵌套 ScrollViews 的分页:

/*
 * User stopped dragging the innerScroll, the view is not decelerating 
 * and it is still not at its place. Lets help the view to get into right place.
 */
-(void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    if ([scrollView isEqual:innerScroll] && !decelerate) {
        if(scrollView.contentOffset.x <= view1.frame.size.width/2){
            [innerScroll scrollRectToVisible:view1.frame animated:YES];
        } else {
            [innerScroll scrollRectToVisible:view2.frame animated:YES];
        }
    }
}

/*
 * User stopped dragging the innerScroll and the View is decelerating. 
 * Lets skip an efforts of the View to get into right place and put it ourselves.
 */
- (void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    if ([scrollView isEqual:innerScroll]) {
        if(scrollView.contentOffset.x <= view1.frame.size.width/2){
            [innerScroll scrollRectToVisible:view1.frame animated:YES];
        } else {
            [innerScroll scrollRectToVisible:view2.frame animated:YES];
        }
    }
}

并在内部 UIScrollView 尚未到达最后一个视图时禁用和启用父 UIScrollViews。

-(void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if([scrollView isEqual:innerScroll]){
        if(CGRectIntersectsRect(scrollView.bounds, view1.frame)){
            if(CGRectIntersectsRect(filterScroll.bounds, view11.frame)){

            } else if(CGRectIntersectsRect(filterScroll.bounds, view22.frame)){

            }
            mainScroll.scrollEnabled = NO;
        } else if (CGRectIntersectsRect(scrollView.bounds, view2.frame)){
            mainScroll.scrollEnabled = YES;
        }
    }
}
于 2013-11-12T13:50:44.170 回答