在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];
}
喵~