如何在 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 上无限滚动?的主要内容,如果未能解决你的问题,请参考以下文章