一、背景
在開發(fā)一款美容業(yè)iPad應(yīng)用期間旨巷,對方提出了一個(gè)類似電腦屏保的功能,把iPad靜置一段時(shí)間后添忘,自動喚起一個(gè)全屏圖片輪播采呐。
二、功能實(shí)現(xiàn)方案
如果算靜置呢搁骑,我想可以定義為用戶不觸摸屏幕一段時(shí)間斧吐,就算用戶沒有操作行為,那只要監(jiān)聽用戶的觸摸行為就可以了仲器。
按觸摸響應(yīng)鏈模式煤率,設(shè)備總是從window開始檢測是否有效觸摸,使用hitTest進(jìn)行不斷的向下傳播乏冀,那我們只要重載window的hitTes方法蝶糯,在里面添加一個(gè)時(shí)間檢測行為就可以了。
三辆沦、具體代碼
- 首先創(chuàng)建一個(gè)自定義的window類昼捍,用來重載方法
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface MMYWindow : UIWindow
@end
NS_ASSUME_NONNULL_END
- 重載hitTest方法,插入一個(gè)檢測入口
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
[self updateOperationInterval];
return [super hitTest:point withEvent:event];
}
- 先取消掉彈出屏保的延時(shí)方法肢扯,重新添加一個(gè)延時(shí)5分鐘執(zhí)行的彈出屏保的調(diào)用妒茬。
- (void)updateOperationInterval
{
[NSObject cancelPreviousPerformRequestsWithTarget:self];
// 5分鐘后進(jìn)入屏保
[self performSelector:@selector(enterScreenSaverMode) withObject:nil afterDelay:60*5];
}
- 彈出屏保的方法里只是簡單的發(fā)一個(gè)系統(tǒng)消息,讓其它地方監(jiān)聽它就好了
- (void)enterScreenSaverMode
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"enterScreenSaverMode" object:nil];
}
- 在appDelegate中使用這個(gè)自定義的window
self.window = [[MMYWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor whiteColor];
- 并在適當(dāng)?shù)奈恢帽O(jiān)聽這個(gè)消息蔚晨,彈出輪播
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showCycleSlide) name:@"enterScreenSaverMode" object:nil];