分页uiscrollview自动滚动到第一页

Posted

技术标签:

【中文标题】分页uiscrollview自动滚动到第一页【英文标题】:Paging uiscrollview automatically scrolls to the first page 【发布时间】:2011-03-09 10:46:13 【问题描述】:

我一直在研究一个分页滚动视图,其中包含几个图像和一个表格视图作为目录。 使用表格我可以跳转到特定页面。除了跳转到页面方法之外,我已经完成了所有工作,当我触摸屏幕时,该方法会将滚动视图带到第一页,除非我滚动到下一页。过去几天一直让我发疯:s

这是我的代码:

-(void)skipToPage      
    NSInteger temp = [selectedPage integerValue];   
    [pagingScrollView setContentOffset:
    [self offsetForPageAtIndex:temp] animated:NO];  
    pagingScrollView.contentSize = [self contentSizeForPagingScrollView]; 


- (CGPoint)offsetForPageAtIndex:(NSUInteger)index                                                                                                         
    CGRect pagingScrollViewFrame = [self frameForPagingScrollView];                                                                                        
    CGPoint offset;                                                                                                                                        
    offset.x = (pagingScrollViewFrame.size.width * index);                                                                                                 
    offset.y = 0;                                                                                                                                          
    return offset;                                                                                                                                         
  

提前谢谢各位!

编辑:scrollviewDidScroll 调用 Tile 页面方法来准备要显示的每个图像

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

    [self tilePages];   

这是来自 Apple 的 photoScroller 示例的方法

- (void)tilePages 

    // Calculate which pages are visible
    CGRect visibleBounds = pagingScrollView.bounds;
    int firstNeededPageIndex = floorf(CGRectGetMinX(visibleBounds) / CGRectGetWidth(visibleBounds));
    int lastNeededPageIndex  = floorf((CGRectGetMaxX(visibleBounds)-1) / CGRectGetWidth(visibleBounds));
    firstNeededPageIndex = MAX(firstNeededPageIndex, 0);
    lastNeededPageIndex  = MIN(lastNeededPageIndex, [self imageCount] - 1);

    // Recycle no-longer-visible pages 
    for (ImageScrollView *page in visiblePages) 
        if (page.index < firstNeededPageIndex || page.index > lastNeededPageIndex) 
            [recycledPages addObject:page];
            [page removeFromSuperview];
        
    
    [visiblePages minusSet:recycledPages];

    // add missing pages
    for (int index = firstNeededPageIndex; index <= lastNeededPageIndex; index++) 
        if (![self isDisplayingPageForIndex:index]) 
            ImageScrollView *page = [self dequeueRecycledPage];
            if (page == nil) 
                page = [[[ImageScrollView alloc] init] autorelease];
            
            [self configurePage:page forIndex:index];
            [pagingScrollView addSubview:page];
            [visiblePages addObject:page];
        
    


【问题讨论】:

您检查了NSInteger temp 变量的值吗?也许这总是 0? 我确实做到了,它是正确的页码!我可以去显示正确的页面,但是当我触摸屏幕时它会滚动到开头。 【参考方案1】:

我搞定了!

问题是由导航控制器与 PhotoScroller 示例应用程序反应不佳引起的!解决它使滚动视图成为标准 UIView 的子视图,例如:

UIView *view = [[UIView alloc] initWithFrame:pagingScrollViewFrame];
    [view addSubview:pagingScrollView];

    self.view = view;

谢谢:)

【讨论】:

很高兴您解决了这个问题。带有此代码的注释。您在此处分配 UIView 对象(保留计数 1),然后将其分配给保留属性(保留计数 2),因此释放控制器时会发生内存泄漏。你需要使这个 UIView 自动释放。 :) 啊内存管理 :) 我仍然遇到问题。感谢您的提示!【参考方案2】:

我不完全确定您所描述的问题是什么。所以我对你所看到的问题的理解:

当您单击表格视图时,您正在调用 skipToPage 消息,正确设置滚动视图的内容偏移量并显示正确的页面?

当您点击视图时,它会跳转到第一页?

如果你能澄清这句话可能会有所帮助:

跳转到页面方法除外 当我触摸屏幕时 滚动视图到第一页,除非我 滚动到下一页。

“触摸屏幕”时应用的状态是什么? 您是在触摸表格视图然后调用 skipToPage 吗? tableview 是第一页滚动视图的子视图吗?

所以假设这是正在发生的事情(如果我遗漏了什么,请纠正我)。您能否在以下消息(和邮政编码)中检查您在做什么:

(void)scrollViewDidScroll:(UIScrollView *)sender;
(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

如果您正在调整这些消息中的内容偏移量,您可能会从滚动视图中获得意外行为。

【讨论】:

感谢您的回答。是的,我从一个单独的视图控制器的 tableview 调用 skipToPage。当滚动视图出现时,我在正确的页面上,但是当我触摸屏幕(滚动除外)时,它会移动到第一页。 @Ahmed 那么当你点击屏幕而不是拖动滚动视图时?拖动滚动视图有效,但点击跳转到第一页? 没错!我编辑了我的问题以包含我使用的代码。我不使用 didEndDecelerating 委托方法。 @Ahmed 看起来您并没有在 viewDidscroll 中设置内容偏移量。您是否为图像视图上的触摸事件做任何事情? 这就是困扰我的地方!我只在 skipToPage 方法中设置内容偏移量。触摸事件仅显示/隐藏顶部栏。正如我所说,如果我滚动一切正常,即使是触摸事件。我的猜测是它来自skipToPage。

以上是关于分页uiscrollview自动滚动到第一页的主要内容,如果未能解决你的问题,请参考以下文章

ElementUI分页Pagination自动到第一页

asp 查询分页后第一页正常第二页显示无记录

jqgrid 滚动分页

UIScrollView 具有自动布局的错误 contentSize

iOS 嵌套 UIScrollViews 使用 AutoLayout

PDFView - 如何自动缩放并仍然加载第一页?