使用UIWindow实现iOS应用屏保功能
程序员文章站
2024-03-16 20:50:16
...
屏保功能这个需求是为了演示用的,本来是想找App Store直营店那些测试机 长时间不动,就会自动播放一个动态图,然后点击就消失的功能。但是找了许久,也没找到类似的,哪怕一点点。。。 忧郁
随,还是自己做吧。求人不如求自己
首先 这个功能是为了能随时弹出来,所以肯定是要present一个VC。其次就是触发方式,在任何界面,长时间不动就会弹出来,所以要有个定时间。(定时器的就是我之前的blog GCD代替NSTimer),最后就是播放视频了,用原生自带的点击事件不好处理,只能用第三方的,找了个比较好的ZFPlayer 可以自定义view控制层。这个下次在说如何自定义。
好了 这次的重点就是如何做一个能在任何界面都能响应点击事件,并且重新倒计时的界面
这个就是UIWindow!
但是要能随时响应,就必须重写一个MainWindow 继承 原来的UIWindow 并重写一个方法
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;
这个就是点击的响应事件触发的方法。
然后在创建一个新view
@property (nonatomic, strong) UIWindow *videoView;
这些都写在.h文件里
接着开始实现这个功能
首先现实hitTest 这个方法
-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ //.m
UIView* result = [super hitTest:point withEvent:event];
if (event ) { //判断是否有点击事件
[self showAlert]; // 执行事件
}
return result;
}
然后
-(void)showAlert{
if (self.videoView == nil) {
self.videoView = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickWindow)];
[self.videoView addGestureRecognizer:tap]; // 创建点击事件 销毁新window
MovieViewController *vc = [[MovieViewController alloc]init];// 创建一个新的控制器
self.videoView.rootViewController = vc;// 将新控制器的rootvc设置为新window
}
// 设置 window 的 windowLevel
self.videoView.windowLevel = UIWindowLevelStatusBar; //TODO: Normal,StatusBar,Alert 分别 为 0,1000,2000 可以修改这里体验 层级变化 对 展示 window的影响
self.videoView.hidden = NO;
[self.videoView makeKeyAndVisible]; //成为keyWindow
}
注意 这里就是创建一个新window 代替原来的window 然后创建一个新的控制器,将新控制器的rootvc设置为新window,修改新window的层级,使它现实出来。
最后就是销毁这个window
// 销毁新window
- (void)clickWindow
{
//window 销毁
self.videoView.hidden = YES; //可有可无 看 UI效果
self.videoView = nil; // 这个方法是真正移除 UIWindow
}
这样就完成了类似屏保的功能。
ps:如果有更好的方法请私信我,毕竟我觉得这个方法还是有点麻烦的。
so finish。。
上一篇: 计算机图形学笔记 || MFC绘图基础
下一篇: CG学习记录(一)数据类型