一、背景
在开发一款美容业iPad应用期间,对方提出了一个类似电脑屏保的功能,把iPad静置一段时间后,自动唤起一个全屏图片轮播。
二、功能实现方案
如果算静置呢,我想可以定义为用户不触摸屏幕一段时间,就算用户没有操作行为,那只要监听用户的触摸行为就可以了。
按触摸响应链模式,设备总是从window开始检测是否有效触摸,使用hitTest进行不断的向下传播,那我们只要重载window的hitTes方法,在里面添加一个时间检测行为就可以了。
三、具体代码
- 首先创建一个自定义的window类,用来重载方法
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MMYWindow : UIWindow
@end
NS_ASSUME_NONNULL_END
- 重载hitTest方法,插入一个检测入口
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
[self updateOperationInterval];
return [super hitTest:point withEvent:event];
}
- 先取消掉弹出屏保的延时方法,重新添加一个延时5分钟执行的弹出屏保的调用。
- (void)updateOperationInterval
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
// 5分钟后进入屏保
[self performSelector:@selector(enterScreenSaverMode) withObject:nil afterDelay:60*5];
}
- 弹出屏保的方法里只是简单的发一个系统消息,让其它地方监听它就好了
- (void)enterScreenSaverMode
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"enterScreenSaverMode" object:nil];
}
- 在appDelegate中使用这个自定义的window
self.window = [[MMYWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
- 并在适当的位置监听这个消息,弹出轮播
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showCycleSlide) name:@"enterScreenSaverMode" object:nil];
网友评论