【问题标题】:How can I make UIScrollView/UIPageControl infinite?如何使 UIScrollView/UIPageControl 无限?
【发布时间】:2014-08-30 11:48:57
【问题描述】:

我用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];
}

【问题讨论】:

标签: ios objective-c iphone xcode uiscrollview


【解决方案1】:

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

- (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 页吗?我不确定它是什么。试试这个一次。在- (void)createPageWithImage:(UIImageView *)frameImage forPage:(int)page的方法里面,加这行看看。 [frameImage setFrame:newView.bounds];
  • 这对我来说没有发生。你的代码的其他部分导致了这个问题。调试一次。特别是您使用滚动视图的代码部分。
  • 当然。你可以发给我。
  • 你确定你给我发了正确的链接吗?因为在这个链接中,我只能看到一张全景图。而且,我看不到您以前的任何代码?
  • 对不起。发现了错误。我再次添加相同的图像视图。因此,它首先消失了。当我这样做时,我在参数内创建图像视图,因此我没有遇到问题。但是我很傻,我没有研究这个问题。目前,我已经编辑了代码并且它正在工作。
猜你喜欢
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多