滚动UITableView时,UIScrollView内容偏移x设置为0

ack*_*ack 2 iphone uitableview uiscrollview uipagecontrol

我有一个UITableView,其中一个UITableViewCells包含一个UIScrollView和一个UIPageControl; 这样用户可以在浏览表格时水平滚动浏览两页.

我的问题是这个 - 最初页面控件工作正常,我可以看到小点按预期移动,因为我浏览滚动视图中的页面.但是,当我向上或向下滚动表格时,页面控件始终重置为第一页.

这是因为我的方法确定了页面,使用scrollview.contentoffset.x来计算我所在的页面,而且我开始向上或向下移动表时,contentoffset.x总是返回0.实际的滚动视图本身不会向左或向右移动(内容保留在正确的页面上); 所以我不确定为什么contentoffset.x总是重置为0?

这是我在cellForRowAtIndexPath中的代码

        UIScrollView* previewScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, cell.frame.size.width, tideRowHeight)];
        [previewScrollView setContentSize:CGSizeMake(640, tideRowHeight)];
        [previewScrollView setPagingEnabled:YES];
        [previewScrollView setTag:0022];
        [previewScrollView setShowsHorizontalScrollIndicator:NO];
        [previewScrollView setDelegate:self];

        [previewScrollView addSubview:todayTidesTime];
        [previewScrollView addSubview:todayTidesHeight];
        [previewScrollView addSubview:todayTidesHL];

        [[cell contentView] addSubview:previewScrollView];


        UIPageControl *tidesPageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, 130, cell.frame.size.width, 10)];
        [tidesPageControl setNumberOfPages:2];
        [tidesPageControl setCurrentPageIndicatorTintColor:[UIColor blackColor]];
        [tidesPageControl setPageIndicatorTintColor:[UIColor grayColor]];
        [[cell contentView] addSubview:tidesPageControl];
        self.pageControl = tidesPageControl;
Run Code Online (Sandbox Code Playgroud)

这是我的代码,它决定了我当前的页面:

(void)scrollViewDidScroll:(UIScrollView *)sender {
CGFloat pageWidth = sender.frame.size.width;

int page = floor((sender.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

NSLog(@"content offset x %f", sender.contentOffset.x);
NSLog(@"scroll view did scroll %d", page);

self.pageControl.currentPage = page;
Run Code Online (Sandbox Code Playgroud)

}

当我向上或向下滚动UITableView时,日志输出以下内容(页面控件位于第2页):

2013-10-17 21:47:36.238 Vic [61180:a0b] content offset x 319.500000
2013-10-17 21:47:36.238 Vic [61180:a0b] page we are on 1
2013-10-17 21:47:36.254 Vic [61180:a0b] content offset x 320.000000
2013-10-17 21:47:36.254 Vic [61180:a0b] page we are on 1
2013-10-17 21:47:40.173 Vic [61180:a0b] content offset x 0.000000   <------scroll up here!
2013-10-17 21:47:40.173 Vic [61180:a0b] page we are on 0            <------ my problem!
2013-10-17 21:47:40.189 Vic [61180:a0b] content offset x 0.000000
Run Code Online (Sandbox Code Playgroud)

为什么contentoffset.x会重置为零?

ack*_*ack 5

解决了; 因为我有一个UIScrollView和一个UITableView,而UITableView继承自UIScrollView,所以table和scrollview都调用了我的scrollViewDidScroll方法.因此,检查sender参数的类名以scrollViewDidScroll可以解决问题 - 如果从表中调用它(即发送者是UITableView),则不执行任何操作.否则,如果它是UIScrollView,则检查页面控件等.