如何使UIScrollView / UIPageControl无限?

时间:2014-08-30 11:48:58

标签: ios objective-c iphone xcode uiscrollview

我创建了一个使用UIPageControlUIScrollView滚动的简单图片,我有三页!所以我需要的是当用户向左滚动page 0时,实际滚动应该移动到page 3,反之亦然。我检查了Apple示例代码,但它太复杂了!这是我的代码:

- (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];
}

1 个答案:

答案 0 :(得分: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的方法。

希望这个答案可以帮到你。