如何在 Xcode 项目中的 Scroll View 上无限滚动?

Posted

技术标签:

【中文标题】如何在 Xcode 项目中的 Scroll View 上无限滚动?【英文标题】:How to make infinity scroll on Scroll View in Xcode project? 【发布时间】:2019-01-09 08:46:30 【问题描述】:

我的应用中有一个滚动视图,它显示了几张幻灯片, 幻灯片的默认行为是当您到达最后一张(例如幻灯片 5)时,它不会向右滚动更多, 或者当您转到第一个时,它不会向左滚动更多。

如何使它无限循环,这意味着当我看到最后一张幻灯片时,我向右滚动,它只会滚动到第一张? (或者从第一个左侧滚动到最后一个)

这是我的 scrollViewDidScroll:

func scrollViewDidScroll(_ scrollView: UIScrollView) 
        let pageIndex = round(scrollView.contentOffset.x/view.frame.width)
        pageControl.currentPage = Int(pageIndex)

        let maximumHorizontalOffset: CGFloat = scrollView.contentSize.width - scrollView.frame.width
        let currentHorizontalOffset: CGFloat = scrollView.contentOffset.x

        // vertical
        let maximumVerticalOffset: CGFloat = scrollView.contentSize.height - scrollView.frame.height
        let currentVerticalOffset: CGFloat = scrollView.contentOffset.y

        let percentageHorizontalOffset: CGFloat = currentHorizontalOffset / maximumHorizontalOffset
        let percentageVerticalOffset: CGFloat = currentVerticalOffset / maximumVerticalOffset


        /*
         * below code changes the background color of view on paging the scrollview
         */
        //        self.scrollView(scrollView, didScrollToPercentageOffset: percentageHorizontalOffset)


        /*
         * below code scales the imageview on paging the scrollview
         */
        let percentOffset: CGPoint = CGPoint(x: percentageHorizontalOffset, y: percentageVerticalOffset)
        print ("present offset: ", percentOffset.x)
        if(percentOffset.x > 0 && percentOffset.x <= 0.25) 

            slides[0].mainPic.transform = CGAffineTransform(scaleX: (0.25-percentOffset.x)/0.25, y: (0.25-percentOffset.x)/0.25)
            slides[1].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.25, y: percentOffset.x/0.25)

         else if(percentOffset.x > 0.25 && percentOffset.x <= 0.50) 
            slides[1].mainPic.transform = CGAffineTransform(scaleX: (0.50-percentOffset.x)/0.25, y: (0.50-percentOffset.x)/0.25)
            slides[2].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.50, y: percentOffset.x/0.50)

         else if(percentOffset.x > 0.50 && percentOffset.x <= 0.75) 
            slides[2].mainPic.transform = CGAffineTransform(scaleX: (0.75-percentOffset.x)/0.25, y: (0.75-percentOffset.x)/0.25)
            slides[3].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x/0.75, y: percentOffset.x/0.75)

         else if(percentOffset.x > 0.75 && percentOffset.x <= 1) 
            slides[3].mainPic.transform = CGAffineTransform(scaleX: (1-percentOffset.x)/0.25, y: (1-percentOffset.x)/0.25)
            slides[4].mainPic.transform = CGAffineTransform(scaleX: percentOffset.x, y: percentOffset.x)

         
    

【问题讨论】:

检查是否可以使用github.com/nicklockwood/iCarousel。而不是自己编写逻辑来实现。 这里是灵魂***.com/questions/16788657/… ios: ScrollView infinite paging - Duplicate end caps的可能重复 @ChiefMadog 我需要更多信息。什么是幻灯片?在 NSObject 中?并且您为每张幻灯片或 UIImageView 显示单独的 UIView ? 我正在为每个人展示一个单独的 UIView 【参考方案1】:

不确定您当前的实现,但您的解决方案将类似于,我假设您的 slides 数组包含每张幻灯片的 UIView。根据您当前的实现更改代码。

(void)scrollViewDidScroll:(UIScrollView *)scrollView 

    if(if(scrollView.contentOffset.x < 0)) 
        CGPoint newOffset = CGPointMake(scrollView.bounds.size.width+scrollView.contentOffset.x, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsRight];
    
    else if(scrollView.contentOffset.x > scrollView.bounds.size.width*2) 
        CGPoint newOffset = CGPointMake(scrollView.contentOffset.x-scrollView.bounds.size.width, scrollView.contentOffset.y);
        [scrollView setContentOffset:newOffset];
        [self rotateViewsLeft];
    


-(void)rotateViewsRight 
    UIView *endView = [slides lastObject];
    [slides removeLastObject];
    [slides insertObject:endView atIndex:0];
    [self setContentViewFrames];



-(void)rotateViewsLeft 
    UIView *endView = slides[0];
    [slides removeObjectAtIndex:0];
    [slides addObject:endView];
    [self setContentViewFrames];



-(void) setContentViewFrames 
    for(int i = 0; i < 5; i++) 
        UIView * view = slides[i];
        [view setFrame:CGRectMake(self.view.bounds.size.width*i, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    

【讨论】:

这是一个 obj C 代码,我说我正在使用 swift,也在为你的评论中,无论如何我用 swift 编写它,它不起作用它具有相同的功能在最后一张幻灯片结束

以上是关于如何在 Xcode 项目中的 Scroll View 上无限滚动?的主要内容,如果未能解决你的问题,请参考以下文章

XCODE 如何跨不同视图使用 IBAction

如何在 XCode 5 中将类附加到情节提要

XCode - UIScrollView 分页不显示子视图(自动布局?)

vie项目在ie里打开报内存不足

XCode:如何调整 UIStackView 中的项目

如何将 TabBar + Navigation 与 XCode 结合使用