欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用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。。