前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS开发之UIScrollView无限滚动

iOS开发之UIScrollView无限滚动

作者头像
YungFan
发布于 2018-05-03 06:42:31
发布于 2018-05-03 06:42:31
1.7K00
代码可运行
举报
文章被收录于专栏:学海无涯学海无涯
运行总次数:0
代码可运行

UIScrollView 的无限滚动主要应用在图片轮播器、欢迎界面等场景。首先需要说明的是,文本所讲的是一种"笨办法",但是好理解且容易实现,在图片不多的时候用它也无妨。它的原理是在要显示的图片前后各加一张图片即在第一张图片之前放最后一张图片,在最后一张图片之后放第一张图片,然后在滚动到边缘的时候,巧妙的过渡一下就可以"瞒天过海","以假乱真"的造成无限滚动的假象。网络上有很多只用三张或两张图片实现的方法,效率比这个方法高,但实现起来稍微麻烦一点,有兴趣的可以去深入研究。

实现步骤

1、根据需求准备几张图片,在网上找了5张图片,分别命名为 img_01,img_02,img_03,img_04,img_05 。 2、代码实现,主要分为:添加UIScrollView,添加显示图片,添加UIPageControl,然后监听UIScrollView的滚动,根据滚动的位置来设置UIPageControl,最重要的是对于滚动到两个边缘时要特殊处理一下,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#import "ViewController.h"

//屏幕宽度
#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
//图片高度
#define IMG_HEIGHT 180
//要显示的图片总数
#define MAX_SIZE 7

#import "ViewController.h"

@interface ViewController () <UIScrollViewDelegate>

//滚动视图
@property (strong, nonatomic)  UIScrollView *loopScrollView;
//指示器
@property (strong, nonatomic)  UIPageControl *pageIndicator;
//要展示的图片数组
@property(strong, nonatomic) NSMutableArray *imgArray;

@end

@implementation ViewController

//懒加载数组
-(NSMutableArray *)imgArray
{
    if(_imgArray == nil)
    {
        _imgArray = [[NSMutableArray alloc]initWithCapacity:MAX_SIZE];
        //在要展示的5张图片的前后各加一张图片,第一张前面加第五张,第五张后面加第一张
        [_imgArray addObject:[UIImage imageNamed:@"img_05.jpg"]];
        for (int i = 1; i< MAX_SIZE - 1; i++) {
            NSString *imgName = [[NSString alloc]initWithFormat:@"img_0%d.jpg", i];
            [_imgArray addObject:[UIImage imageNamed:imgName]];
        }
        [_imgArray addObject:[UIImage imageNamed:@"img_01.jpg"]];
        
    }
    return _imgArray;
}


- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setupScrollView];
    [self setupPageControl];
    
}

/**
 *  创建UIScrollView并设置其属性
 */
-(void)setupScrollView
{
    UIScrollView *sc = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, IMG_HEIGHT)];

    //创建UIImageView并添加到UIScrollView中
    for (int i = 0; i< MAX_SIZE; i++) {
        UIImageView *img = [[UIImageView alloc]initWithImage:[self.imgArray objectAtIndex:i]];
        img.frame = CGRectMake(SCREEN_WIDTH * i, 0, SCREEN_WIDTH, IMG_HEIGHT);
        [sc addSubview:img];
    }
    
    //设置UIScrollView的属性
    sc.contentSize = CGSizeMake(SCREEN_WIDTH * self.imgArray.count, IMG_HEIGHT);
    sc.showsHorizontalScrollIndicator = NO;
    sc.pagingEnabled = YES;
    //刚开始应该滚动到第二张显示,因为第一张其实是最后一张图片
    [sc setContentOffset:CGPointMake(SCREEN_WIDTH, 0) animated:NO];


    //设置代理并添加到当前view中
    sc.delegate = self;
    [self.view addSubview:sc];
    
    self.loopScrollView = sc;
}


/**
 *  创建UIPageControl并设置其属性
 */
-(void)setupPageControl
{
    //注意frame,这样设置可以居中显示
    UIPageControl *pc = [[UIPageControl alloc]initWithFrame:CGRectMake(self.view.center.x - 50, CGRectGetMaxY(self.loopScrollView.frame) - 25 , 100, 25)];
    //设置UIPageControl的属性并添加到当前view中
    pc.numberOfPages = MAX_SIZE - 2;
    pc.currentPage = 0;
    pc.pageIndicatorTintColor = [UIColor redColor];
    [self.view addSubview:pc];
    
    self.pageIndicator = pc;
    
}

//UIScrollView的代理方法,在该方法中改变UIPageControl并且处理边缘滚动
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    //获取当前UIScrollView的位置
    CGPoint offset = [scrollView contentOffset];
    //算出滚动到第几页
    int currentPage = offset.x/SCREEN_WIDTH;
    //设置UIPageControl
    self.pageIndicator.currentPage = currentPage - 1;
    //对最后一张和第一张要进行特殊处理
    //1、如果是第一张
    if (currentPage == 0) {
        //下面两个方法任选其一都可以达到效果,但是注意动画一定要设置为NO,不然会有视觉会有辣眼睛的感觉
        //方法1
        [self.loopScrollView setContentOffset:CGPointMake(SCREEN_WIDTH * (MAX_SIZE-2), 0) animated:NO];
        //方法2,该方法要求设置contentSize时,任一方向就算不滚动也不能为0,否则无效
        //[self.loopScrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH * (MAX_SIZE-2), 0, SCREEN_WIDTH, IMG_HEIGHT) animated:NO];
        self.pageIndicator.currentPage = MAX_SIZE - 2;
    }
    
    //2、如果是最后一张
    else if(currentPage == MAX_SIZE - 1) {
        [self.loopScrollView setContentOffset:CGPointMake(SCREEN_WIDTH, 0) animated:NO];
        //[self.loopScrollView scrollRectToVisible:CGRectMake(SCREEN_WIDTH, 0, SCREEN_WIDTH, IMG_HEIGHT) animated:NO];
        self.pageIndicator.currentPage = 0;
    }
}

@end
实现效果

图片无限轮播.gif

写在后面的话

其实实现轮播现在最好的方案应该是使用UICollectionView,因为它是利用重用机制来实现的,性能会好很多,代码写起来类似。后面有机会的话奉献一下实现方案~~~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016.10.13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
IOS开发系列——启动页专题【整理,部分原创】
两种方式,一种是使用系统自带的,按规则定义启动图片名称即可,显示为1秒,要想延长时间,用[nsthread sleepForTimeInterval:5.0] ,另一种就是自定义uiivew,加到window中去。
江中散人_Jun
2022/03/08
1.9K0
IOS开发系列——启动页专题【整理,部分原创】
iOS学习笔记——滚动视图(scrollView)
滚动视图:在根视图中添加UIScrollViewDelegate协议,声明一些对象属性
全栈程序员站长
2022/07/18
1.4K0
UIScrollView 和 UIPageControl 实现启动滑动图[通俗易懂]
更多的关于NSUserDefaults的介绍请看:NSUserDefaults 简介
全栈程序员站长
2022/07/20
6690
iOS开发之多图片无缝滚动组件封装与使用
  经常有园友会问"博主,有没有图片无限滚动的Demo呀?", 正儿八经的图片滚动的Demo我这儿还真没有,今天呢就封装一个可以在项目中直接使用的图片轮播。没看过其他iOS图片无限轮播的代码,也不了解他们的原理,我今天封装这个图片无限轮播是借鉴Web前端中的做法,因为之前写Web前端的时候,实现幻灯片就是这么做的,今天就在iPhone上搞搞。下面的东西是自己写的了,关于轮播的东西这个开源项目也是相当不错的https://github.com/nicklockwood/iCarousel ,感兴趣的可以看一下
lizelu
2018/01/11
1.8K0
iOS开发之多图片无缝滚动组件封装与使用
iOS-UIScrollerView
xy_ss
2023/11/22
1850
iOS-UIScrollerView
iOS开发中简单的图片浏览器
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53010697
用户1451823
2018/09/13
1.1K0
两个imageView实现图片轮播
前言 在不少的项目中,都会用到图片轮播这个功能,现在网上关于图片轮播的轮子也层出不穷,千奇百怪,笔者根据自己的思路,用两个imageView也实现了图片轮播,这里给大家介绍笔者的主要思路以及大概步骤。
Scott_Mr
2018/05/16
1.1K0
xcode uiscrollview with paging and zoom
Here is a simple and sample code that demonstrate the photo slide function with zoom using uiscrollview.  image.png this is the first photo  image.png sliding image.png zooming in particular photo  1. first drag three photos to your project , size no
阿新
2018/04/12
1.1K0
xcode uiscrollview with paging and zoom
iOS开发之多表视图滑动切换示例(仿"头条"客户端)
  好长时间没为大家带来iOS开发干货的东西了,今天给大家分享一个头条新闻客户端各个类别进行切换的一个示例。在Demo中对所需的组件进行的简单封装,在封装的组件中使用的是纯代码的形式,如果想要在项目中进行使用,稍微进行修改即可。   废话少说,先介绍一下功能点,下图是整个Demo的功能点,最上面左边的TabBarButtonItem是用来减少条目的,比如下图有三个按钮,点击减号会减少一个条目。右边的为增加一个条目。点击相应的按钮是切换到对应的表视图上,下方红色的是滑动的指示器,同时支持手势滑动。运行具体效果
lizelu
2018/01/11
3.8K0
iOS开发之多表视图滑动切换示例(仿"头条"客户端)
【IOS开发基础系列】UIScrollView专题
       在滚动过程当中,其实是在修改原点坐标。当手指触摸后,scroll view会暂时拦截触摸事件,使用一个计时器。假如在计时器到点后没有发生手指移动事件,那么scroll view 发送 tracking events 到被点击的subview。假如在计时器到点前发生了移动事件,那么 scroll view 取消tracking 自己发生滚动。
江中散人_Jun
2023/10/16
6760
【IOS开发基础系列】UIScrollView专题
iOS_scrollView title and line view, 滚动的标题和线
废话不多说, 直接上代码 // // MOTitleLineView.h // MOTitleLineView // // Created by 莫小言 on 15/12/17. // Copyright © 2015年 莫小言. All rights reserved. // #import <UIKit/UIKit.h> // title 对齐type typedef NS_ENUM(NSUInteger, MOTitleLineViewType) { MOTitleLineViewTy
mikimo
2022/07/20
8880
iOS_scrollView title and line view, 滚动的标题和线
UIScrollerView当前显示3张图
WSLScrollView功能描述:这是在继承UIView的基础上利用UIScrollerView进行了封装,支持循环轮播、自动轮播、自定义时间间隔、图片间隔、当前页码和图片大小,采用Block返回当
且行且珍惜_iOS
2018/05/22
9000
[iOS] 小问题记录
iOS 往数据库里写保存文件路径的时候,不要写全路径,因为软件更新或者重新安装沙盒路径会变
wOw
2018/09/18
3.4K0
VVeboTableView 源码解析
最近在看一些iOS性能优化的文章,我找到了VVeboTableView这个框架。严格来说这个不属于框架,而是作者用自己的方式优化UITableView的一个实践。
用户2932962
2018/08/30
1.2K0
VVeboTableView 源码解析
iOS视图滚动的时候控制导航条标题及公告视图的alpha(显示与隐藏)
应用场景:比如设计给我们的是一张黑色的返回箭头图.我们某个页面需要弄成白色的话.又不想重新设计一下新的图片
公众号iOS逆向
2021/07/29
1.6K0
iOS14开发-UIView
在 iOS 13 中引入了新的 API — Diffable Data Source,它不仅能够驱动 UITableView 和 UICollectionView,而且可以更简单高效的实现数据的刷新。
YungFan
2021/01/21
11.9K0
Swift日常开发随笔
提示:之所以为空白,是因为我把下拉列表中的tableView.reloadData()这行代码屏蔽掉了,加入的数组没有刷新。
编程怪才-凌雨画
2020/10/11
2K0
UIScrollView视觉差动画
前言:看到凤凰新闻 头条栏目的编辑推荐新闻是这个效果,觉得不错,就想着实现一下,以下就是我的实现过程,示例代码请看这儿→UIScrollView视觉差动画。 总效果 一、首先实现一个基本的图集浏览
且行且珍惜_iOS
2018/05/22
7210
实践-小效果 Ⅳ
设置一个UIImageView为倒立的同等控件,设置这个UIImageView的layer的mask为一个渐变图层,效果就出来了。
進无尽
2018/09/12
6420
实践-小效果 Ⅳ
iOS17适配指南之UIPageControl
YungFan
2023/07/24
4680
iOS17适配指南之UIPageControl
相关推荐
IOS开发系列——启动页专题【整理,部分原创】
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文