iOS界面美如画---ScrollView轮播

在iOS中,ScorllView是最常用且最为普遍的一个控件,比如常用的APP中,淘宝、京东、简书、虎牙直播等等实在是数不胜数了。废话不多说,跟我来一起撸一个ScrollView轮播吧:

1.ScrollView 的使用

对于scrollView的使用,应该是任何一个新手都要清楚的,当然跟一般的控件使用类似,请看示例代码:

//以属性的方式定义一个scrollView
@property (weak, nonatomic) UIScrollView *scrollView;

//初始化以及其他设置
//kNavigationH 导航栏和状态栏的高度
//frame是指可见区域
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, kNavigationH, self.view.bounds.size.width, 200)];
self.scrollView = scrollView;
//添加背景色目的是可以看见控件
self.scrollView.backgroundColor = [UIColor redColor];
self.scrollView.delegate = self;
[self.view addSubview:self.scrollView];

//ScrollView的真实大小 count指滑动的页数
self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * count, 400);
//整页滑动
self.scrollView.pagingEnabled = YES;
//可弹性
self.scrollView.bounces = NO;
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
[self.scrollView setContentOffset:CGPointMake(self.view.bounds.size.width, 0) animated:NO];

//小圆点的话使用pageControl
......

对,创建一个ScrollView就是这么简单
那么对于ScrollView的整页滑动,肯定需要创建一个pageControl来进行控制是吗?
其实也很简单,代码走起:

//属性
@property (weak, nonatomic) UIPageControl *pageControl;

//这里frame我是随便写的,真正的去经过计算
UIPageControl *pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(0, self.scrollView.bounds.size.height, self.scrollView.bounds.size.width, 50)];
self.pageControl = pageControl;
self.pageControl.numberOfPages = count;//指定页面个数
self.pageControl.currentPage = 0;//指定pagecontroll的值,默认选中的小白点(第一个)
//添加委托方法,当点击小白点就执行此方法
//...
self.pageControl.userInteractionEnabled = NO;
self.pageControl.pageIndicatorTintColor = [UIColor whiteColor];// 设置非选中页的圆点颜色
self.pageControl.currentPageIndicatorTintColor = [UIColor orangeColor];
//默认的情况下是不可以设置图片的,但是可以用KVC的方式去设置
[self.pageControl setValue:[UIImage imageNamed:@"image1"] forKeyPath:@"_pageImage"];
//注意是self.view
[self.view addSubview:self.pageControl];

也是这么简单就创建了page小圆点,那么用小圆点去监控界面滑动呢?
其实也很简单,在ScrollView的代理方法里面添加上page对ScrollView的控制就可以了

//不要忘记 UIScrollViewDelegate
//ScrollView滑动结束的代理方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    //如果想要精细一点可以是滑动1/2的时候就添加
    NSInteger currentPage = (scrollView.contentOffset.x) / scrollView.bounds.size.width;
    self.pageControl.currentPage = currentPage;
}

这样就实现了一个手动可以滑动且用原定控制的ScrollView.

2.淘宝图片下面的弧线

看某宝的滚动视图下面有弧线,白色底色,难道是直接设置弧形图片?
那当然不是了,其实也很简单,就是绘制图片.
我使用贝塞尔简单的实现了一下,参考代码:

//strImageName 图片名称
UIImage *anotherImage = [UIImage imageNamed:strImageName];
//开启图片上下文
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0);

CGFloat width = self.view.bounds.size.width  * 0.5;
CGFloat begin = 17 * 3.1415926 / 12;
CGFloat end = 19 * 3.1415926 / 12;
//绘制弧线
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(width, 200 + 3.732 * width)
                                        radius:width*3.864
                                    startAngle:begin
                                      endAngle:end
                                     clockwise:YES];
//绘制其他边
[path addLineToPoint:CGPointMake(width*2, 0)];
[path addLineToPoint:CGPointMake(0, 0)];
[path addLineToPoint:CGPointMake(0, 200)];
//图形封闭
[path addClip];
//重新绘制   
[anotherImage drawInRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();    

我这里是按30度去绘制的,可以采取更小的角度去绘制

3.实现轮播

这里实现轮播的话,原理很简单,就是滑动到最后一页的时候设置它为首页.
目前我实现的话用了两种方式:

  • 在滚动图片的数组之前添加一个最后一张图片,在最后添加一张第一张图片,滚动到最后一张的时候设置其为第一张,滚动到第一张的时候设置为最后一张
    代码类似于上面的pagecontrol的设置
  • 第二种方式是设置scrollView始终是三张图片来滚动,显示的是最中间的一张图片,滑动的时候动态的去替换将要滑动的图片
    这里有一位大同学对第二种方式有一个详解
    https://www.jianshu.com/p/ef03ec7f23b2

4.定时轮播

很简单,添加一个定时器进行控制,需要注意的是,在滑动和停止滑动的时候要对定时器进行处理
简单示例代码:

//滑动的时候停止定时器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    [self stopAutoScroll];
}

//停止滑动之后开启定时器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    [self startAutoScroll];
}

喵~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容