ios - 如何使 UIScrollView/UIPageControl 无限?

标签 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];
}

最佳答案

添加我已更改的方法。我已在必要时发表评论。

- (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 的方法。

希望这个回答对你有帮助。

关于ios - 如何使 UIScrollView/UIPageControl 无限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25582034/

相关文章:

iphone - UIDocument 和一个 NSDictionary

ios - 我如何向 CoreData 指示对象已更改?

iphone - 为什么我不能注册我的 iOS 应用程序来处理图像文件类型?

iphone - 通用 iPad/iPhone XIB - Xcode 4

iphone - 在 iTunesConnect 上添加应用程序购买只允许免费订阅

ios - 如果不推荐使用 NetService,我应该如何在 macOS 上执行 mDNS?

ios - 我们可以在XCODE 6.0.1 中安装iOS 6 模拟器吗?

ios - 从 NSString 中删除\(仅从转义序列中删除)

iphone - 为什么标签文本不总是从同一点开始?

iphone - 如何保证核心数据实体的单一实例