需求
实现图片轮播器,搭配页面指示器、可以自动轮播。
注意计时器优先级问题
分析
- 需要UIScrollView组件、指示器UIPageControl。此外自定义类需要实现代理
- 自动滚动需要监控当前屏幕的offsetx。
- 防止拖拽自动滚动时一下子翻滚太多的BUG:拖拽时,撤销当前timer,放开再创建新的timer。
- 注意计时器优先级问题,使用计时器,经常会出现被其它组件抢占线程的情况,所以代码要做出修改,修改消息循环中计时器的优先级。
实现
· 自定义类的创建:
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface PicAutoPlayView : UIView<UIScrollViewDelegate>
@property (nonatomic, strong) UIScrollView *scrollView;
@property (nonatomic, strong) UIPageControl *pagecontrol;
// 为图片滚动拖住不放而自动滚动的记时也停止,需要在类中引用计时器:否则有BUG
// 弱引用即可,销毁不跟随此类:在开始拖拽的方法中实现
@property(weak, nonatomic) NSTimer *timer;
@end
NS_ASSUME_NONNULL_END
· 功能实现:
#import "PicAutoPlayView.h"
@implementation PicAutoPlayView
/*
遇到问题:
图片不显示:UIScrollView没有初始化
图片像素太大,截一下
此外,其它可滚动的同优先级组件在响应其它处理时,会影响当前自动滚动组件的计时器,因为主线程跑去执行那个任务了
消息循环:
// 获取当前消息循环对象
NSRunLoop:让timer优先级和当前控件一样,即可。
*/
/*
没有显示图片:
输出一下sc坐标和imgview坐标
*/
-(instancetype) initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
// 其实scrollview整个就是加进的全部UIImageView
_scrollView.backgroundColor = [UIColor grayColor];
// scrollview没有初始化,半天找不到它
_scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(10