???在滚动视图(UITableView,UIScrollView)上添加的定时器在父视图滚动的时候,定时器会停止:
整个页面是一个UITableView,其实还没截取完,上面还有图片的滚动视图,和一行滚动的公告信息。现在主要来看黄色框里面的,这是一个分区,分区在添加一个UIScrollView,里面的信息可以手动滑动,点击查看。主要是自己滚动:
//添加一个定时器来让UISrollView自己滚动,两秒上移一行
NSTimer *bidTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changeBidScroll) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:bidTimer forMode:NSDefaultRunLoopMode];
//滚动的方法,就是一个简单的UIView动画。
-(void)changeBidScroll{
[UIView animateWithDuration:0.5 animations:^{
CGPoint point = bidScroll.contentOffset; //bidScroll黄色框
point.y += 30*SCALE; //SCALE是一个宏定义,比例高度
bidScroll.contentOffset = point;
}];
//判断信息数组是否滚动到最后一行,在滚动到第一行
if (bidScroll.contentOffset.y > self.bidNewArr.count * 30*SCALE) {
bidScroll.contentOffset = CGPointMake(0, 30*SCALE);
}
}
要想在整个视图滚动的时候,下面的黄框内仍然自己滚动着:
[[NSRunLoop currentRunLoop] addTimer:bidTimer forMode:NSRunLoopCommonModes];
把NSDefaultRunLoopMode改为NSRunLoopCommonModes,就可以实现了。
程序启动的时候,系统默认注册了RunLoop的五种mode:
kCFRunLoopDefaultMode: 默认 mode,通常主线程在这个 mode 下运行,一般这样写我们:
NSTimer *bidTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(changeBidScroll) userInfo:nil repeats:YES];
定时器也可以在不添加进runloop时也自动滚动,是因为程序默认把这个定时器加入当前的默认kCFRunLoopDefaultMode(NSDefaultRunLoopMode)下。mainRunLoop一般也会得到这个mode。UITrackingRunLoopMode: 追踪mode,这个就是我们刚刚说的NSRunLoopCommonModes,保证UIScrollview滑动顺畅不受其他 mode 影响。所以当页面滚动的时候,RunLoop的Mode会自动切换成UITrackingRunLoopMode模式,因此NSTimer会失效,当停止滑动,RunLoop又会切换回NSDefaultRunLoopMode模式,因此timer又会重新启动了。滚动时mainRunLoop会得到这个mode。
UIInitializationRunLoopMode: 启动程序后的过渡mode,启动完成后就不再使用。
4: GSEventReceiveRunLoopMode: Graphic相关事件的mode,通常用不到。
5: kCFRunLoopCommonModes: 占位用的mode,作为标记kCFRunLoopDefaultMode和UITrackingRunLoopMode用
Runloop还有很多用处,但是我自己也没用到就不瞎说了。
想深入了解RunLoop的话点这里。http://blog.ibireme.com/2015/05/18/runloop/
这里我还想问问路过的大神,从当前页面push到下个页面,再返回的时候怎么做才可以让当前的页面上定时器的滚动不会重头开始,而是push时的那一个。方法尽量简单合理一劳永逸,不要出现乱滚动。