二 6. NSTimer的使用(一)
定时器
1. NSTimer叫做“定时器”,它的作用如下:
-
在指定的时间执行指定的任务
-
每隔一段时间执行指定的任务
2.定时器的使用
2.1 创建对象的方法和定时器的方法
-
调用下面的方法就会开启一个定时任务
+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
每隔ti秒,调用一次aTarget的aSelector方法,yesOrNo决定了是否重复执行这个任务
-
通过invalidate方法可以停止定时器的工作,一旦定时器被停止了,就不能再次执行任务。只能再创建一个新的定时器才能执行新的任务【这个定时器是被释放了吗】
-(void)invalidate
2.1 解决定时器在主线程不工作的问题
代码:NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(next) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
多线程的技术:同时执行只是一个假象
代码示例:
// 框架: // 1.苹果官方的框架:UIKit // 2.自定义框架 // 3.第三方框架:流媒体 #import "XMGPageView.h" @interface XMGPageView() <UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic) IBOutlet UIPageControl *pageControl; /** 定时器 */ @property (nonatomic, strong) NSTimer *timer; @end @implementation XMGPageView #pragma mark - 初始化方法 /** * 当控件通过代码创建时,就会调用这个方法 * 当控件通过代码创建时,想做一些初始化操作。应该在这个方法中执行 */ - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { [self setup]; // 添加子控件代码 } return self; } /** * 当控件从xib\storyboard中创建完毕时,就会调用这个方法 * 当控件从xib\storyboard中创建完毕后的初始化操作。应该在这个方法中执行 */ - (void)awakeFromNib { [self setup]; } /** * 初始化代码 */ - (void)setup { self.scrollView.backgroundColor = [UIColor redColor]; // 开启定时器 [self startTimer]; } + (instancetype)pageView { return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject]; } /** * 当控件的尺寸发生改变的时候,会自动调用这个方法 */ - (void)layoutSubviews { [super layoutSubviews]; // 设置scrollView的frame self.scrollView.frame = self.bounds; // 获得scrollview的尺寸 CGFloat scrollW = self.scrollView.frame.size.width; CGFloat scrollH = self.scrollView.frame.size.height; // 设置pageControl CGFloat pageW = 100; CGFloat pageH = 20; CGFloat pageX = scrollW - pageW; CGFloat pageY = scrollH - pageH; self.pageControl.frame = CGRectMake(pageX, pageY, pageW, pageH); // 设置内容大小 self.scrollView.contentSize = CGSizeMake(self.imageNames.count * scrollW, 0); // 设置所有imageView的frame for (int i = 0; i<self.scrollView.subviews.count; i++) { UIImageView *imageView = self.scrollView.subviews[i]; imageView.frame = CGRectMake(i * scrollW, 0, scrollW, scrollH); } } #pragma mark - setter方法的重写 - (void)setImageNames:(NSArray *)imageNames { _imageNames = imageNames; // 移除之前的所有imageView // 让subviews数组中的所有对象都执行removeFromSuperview方法 [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; // 根据图片名创建对应个数的imageView for (int i = 0; i<imageNames.count; i++) { UIImageView *imageView = [[UIImageView alloc] init]; imageView.image = [UIImage imageNamed:imageNames[i]]; [self.scrollView addSubview:imageView]; } // 设置总页数 self.pageControl.numberOfPages = imageNames.count; // if (imageNames.count <= 1) { // self.pageControl.hidden = YES; // } else { // self.pageControl.hidden = NO; // } // self.pageControl.hidden = imageNames.count <= 1; // self.pageControl.hidesForSinglePage = YES; } - (void)setCurrentColor:(UIColor *)currentColor { _currentColor = currentColor; self.pageControl.currentPageIndicatorTintColor = currentColor; } - (void)setOtherColor:(UIColor *)otherColor { _otherColor = otherColor; self.pageControl.pageIndicatorTintColor = otherColor; } #pragma mark - <UIScrollViewDelegate> - (void)scrollViewDidScroll:(UIScrollView *)scrollView { self.pageControl.currentPage = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5); } //开始滑动 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { [self stopTimer]; } //停止滑动 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [self startTimer]; } #pragma mark - 定时器控制 - (void)startTimer { // 创建一个定时器 自动启动 self.timer = [NSTimer scheduledTimerWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; // self.timer = [NSTimer timerWithTimeInterval:1.5 target:self selector:@selector(nextPage) userInfo:nil repeats:YES]; //启动 // [self.timer fire]; [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes]; } - (void)stopTimer { [self.timer invalidate]; self.timer = nil; //释放内存 } /** * 下一页 */ - (void)nextPage { NSInteger page = self.pageControl.currentPage + 1; if (page == self.pageControl.numberOfPages) { page = 0; } CGPoint offset = self.scrollView.contentOffset; offset.x = page * self.scrollView.frame.size.width; [self.scrollView setContentOffset:offset animated:YES]; // animate at constant velocity to new offset NSLog(@"nextPage"); } @end
补充
- 硬键盘和软键盘: 硬键盘就是mac上的键盘,软键盘就是iPhone上的键盘。在模拟器上用软键盘不用硬键盘设置:Hardware -- keyboard-- connect Hardware Keyboard 去掉勾选就可以了

浙公网安备 33010602011771号