2014-08-30 61 views
1

我創建了一個簡單的圖像滾動UIPageControlUIScrollView,我有三個頁面!所以我需要的是當用戶向左滾動page 0,實際上滾動應該移動到page 3,反之亦然。我已經檢查過蘋果示例代碼,但它太複雜了!,這裏是我的代碼:如何讓UIScrollView/UIPageControl無限?

- (void)setupScrollView { 


    _pageControl.currentPage = 0; 
    _pageControl.numberOfPages = 3; 
    [_scrollView setContentSize:CGSizeMake(_scrollView.frame.size.width * _pageControl.numberOfPages, _scrollView.frame.size.height)]; 
    _scrollView.delegate = self; 

    [self createPageWithImage:_image1 forPage:0]; 
    [self createPageWithImage:_image2 forPage:1]; 
    [self createPageWithImage:_image3 forPage:2]; 


} 

    - (void)createPageWithImage:(UIImageView *)frameImage forPage:(int)page 
    { 
     UIView *newView = [[UIView alloc] initWithFrame: CGRectMake(_scrollView.frame.size.width * page, 0, _scrollView.frame.size.width, _scrollView.frame.size.height)]; 
     [newView addSubview: frameImage]; 
     [_scrollView addSubview: newView]; 

    } 


    - (void)scrollViewDidScroll: (UIScrollView *) sView 
    { 

     CGFloat offset = _scrollView.contentOffset.x; 
     CGFloat pageSize = _scrollView.frame.size.width; 

     int page = floor((offset + (pageSize/2))/pageSize); 
     _pageControl.currentPage = page; 



    } 





- (IBAction)changeThePage 
{ 

    CGRect pageRect = CGRectMake(_pageControl.currentPage * _scrollView.frame.size.width, 0, _scrollView.frame.size.width, _scrollView.frame.size.height); 

    [_scrollView scrollRectToVisible: pageRect animated: YES]; 
} 
+0

檢查:http://stackoverflow.com/questions/22525594/uipagecontrol-circular-infinite-scrolling/22526183#22526183 – 2014-08-30 11:54:02

回答

2

添加我已更改的方法。我已經在必要的地方評論過。

- (void)setupScrollView { 
    _pageControl.currentPage = 0; 
    _pageControl.numberOfPages = 3 ; 
    //Add 2 more pages. 
    [_scrollView setContentSize:CGSizeMake(_scrollView.frame.size.width * (_pageControl.numberOfPages + 2), _scrollView.frame.size.height)]; 
    _scrollView.delegate = self; 

    // Seriously recommend this for this type of apps. 
    _scrollView.pagingEnabled = YES; 

    // Do not instantiate imageviews. Send only image names as string. 
    // Add last image at beginning of scroll view. 
    [self createPageWithImageName:@"imageName3" forPage:0]; 

    // Increase page number of existing images. 
    [self createPageWithImageName:@"imageName1" forPage:1]; 
    [self createPageWithImageName:@"imageName2" forPage:2]; 
    [self createPageWithImageName:@"imageName3" forPage:3]; 

    //Add first image at end of scroll view 
    [self createPageWithImageName:@"imageName1" forPage:4]; 

    // Show first image but present in second page. 
    [_scrollView setContentOffset:CGPointMake(_scrollView.frame.size.width, 0) animated:NO]; 
} 

// Instead of sending image views, send image name. Create image view inside this method. 
// This is because, since we are adding two more images, separate image view needs 
// to be created. Otherwise, same image view will be used and one added at the end 
// will be used as the frame of the image. 
- (void)createPageWithImageName:(NSString *)imageName forPage:(int)page 
{ 

    UIView *newView = [[UIView alloc] initWithFrame: CGRectMake(_scrollView.frame.size.width * page, 0, _scrollView.frame.size.width, _scrollView.frame.size.height)]; 
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:newView.bounds]; 
    imageView.image = [UIImage imageNamed:imageName]; 

    [newView addSubview: imageView]; 
    [_scrollView addSubview: newView]; 

} 

- (void)scrollViewDidScroll: (UIScrollView *) sView 
{ 
    CGFloat offset = _scrollView.contentOffset.x; 
    CGFloat pageSize = _scrollView.frame.size.width; 

    int page = floor((offset + (pageSize/2))/pageSize); 
    if (page == 0) { 
     page = _pageControl.numberOfPages - 1; 
    } 
    else if (page == _pageControl.numberOfPages + 1) { 
     page = 0; 
    } 
    else { 
     page = page - 1; 
    } 
    _pageControl.currentPage = page; 

    // If present in scroll view's first page, move it to second last page 
    if (offset < pageSize) { 
     [_scrollView setContentOffset:CGPointMake(pageSize * 3 + offset, 0) animated:NO]; 
    } 
    // If present in scroll view's last page, move it to second page. 
    else if (offset >= pageSize * (_pageControl.numberOfPages + 1)) { 
     CGFloat difference = offset - pageSize * _pageControl.numberOfPages; 
     [_scrollView setContentOffset:CGPointMake(difference, 0) animated:NO]; 
    } 
} 

該代碼不需要changeThePage的方法。

希望這個答案可以幫助你。

+0

它只發生在第0頁?我不確定它是什麼。只需嘗試一次。在' - (void)createPageWithImage:(UIImageView *)frameImage forPage:(int)頁面'的方法裏面,只需添加這行並參見。 '[frameImage setFrame:newView.bounds];' – user1190882 2014-08-30 17:31:52

+0

這不會發生在我身上。你的代碼的其他部分導致了這個問題。調試一次。特別是您使用滾動視圖的代碼部分。 – user1190882 2014-08-30 17:38:07

+0

當然。你可以發給我。 – user1190882 2014-08-30 17:41:06

相關問題