123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- //
- // BKPasscodeLockScreenManager.m
- // BKPasscodeViewDemo
- //
- // Created by Byungkook Jang on 2014. 8. 2..
- // Copyright (c) 2014년 Byungkook Jang. All rights reserved.
- //
- #import "BKPasscodeLockScreenManager.h"
- #import "BKPasscodeViewController.h"
- static BKPasscodeLockScreenManager *_sharedManager;
- @interface BKPasscodeLockScreenManager ()
- @property (strong, nonatomic) UIWindow *mainWindow;
- @property (strong, nonatomic) UIWindow *lockScreenWindow;
- @property (strong, nonatomic) UIView *blindView;
- @end
- @implementation BKPasscodeLockScreenManager
- + (BKPasscodeLockScreenManager *)sharedManager
- {
- static dispatch_once_t onceToken;
- dispatch_once(&onceToken, ^{
- _sharedManager = [[BKPasscodeLockScreenManager alloc] init];
- });
- return _sharedManager;
- }
- - (void)showLockScreen:(BOOL)animated
- {
- NSAssert(self.delegate, @"delegate is not assigned.");
-
- if (self.lockScreenWindow && self.lockScreenWindow.rootViewController) {
- return;
- }
-
- if ([self.delegate respondsToSelector:@selector(lockScreenManagerShouldShowLockScreen:)]) {
- if (NO == [self.delegate lockScreenManagerShouldShowLockScreen:self]) {
- return;
- }
- }
-
- // get the main window
- #ifndef EXTENSION
- self.mainWindow = [[UIApplication sharedApplication] keyWindow];
- // dismiss keyboard before showing lock screen
- [self.mainWindow.rootViewController.view endEditing:YES];
- #endif
-
- // add blind view
- UIView *blindView;
-
- if ([self.delegate respondsToSelector:@selector(lockScreenManagerBlindView:)]) {
- blindView = [self.delegate lockScreenManagerBlindView:self];
- }
-
- if (nil == blindView) {
- blindView = [[UIView alloc] init];
- blindView.backgroundColor = [UIColor whiteColor];
- }
-
- blindView.frame = self.mainWindow.bounds;
- blindView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
-
- [self.mainWindow addSubview:blindView];
-
- self.blindView = blindView;
-
- // set dummy view controller as root view controller
- BKPasscodeDummyViewController *dummyViewController = [[BKPasscodeDummyViewController alloc] init];
-
- UIWindow *lockScreenWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- lockScreenWindow.windowLevel = self.mainWindow.windowLevel + 1;
- lockScreenWindow.rootViewController = dummyViewController;
- lockScreenWindow.backgroundColor = [UIColor clearColor];
- [lockScreenWindow makeKeyAndVisible];
-
- // present lock screen
- UIViewController *lockScreenViewController = [self.delegate lockScreenManagerPasscodeViewController:self];
-
- if (animated) {
- blindView.hidden = YES;
- }
-
- [lockScreenWindow.rootViewController presentViewController:lockScreenViewController animated:animated completion:^{
- blindView.hidden = NO;
- }];
-
- self.lockScreenWindow = lockScreenWindow;
-
- [lockScreenViewController.view.superview bringSubviewToFront:lockScreenViewController.view];
-
- dummyViewController.delegate = self;
- }
- - (void)dummyViewControllerWillAppear:(BKPasscodeDummyViewController *)aViewController
- {
- // remove blind view
- [self.blindView removeFromSuperview];
- self.blindView = nil;
- }
- - (void)dummyViewControllerDidAppear:(BKPasscodeDummyViewController *)aViewController
- {
- if ([UIView instancesRespondToSelector:@selector(tintColor)]) {
- self.lockScreenWindow = nil;
- } else {
- [self performSelector:@selector(setLockScreenWindow:) withObject:nil afterDelay:0.1f]; // workaround for wired dealloc on iOS 6
- }
-
- [self.mainWindow makeKeyAndVisible];
- self.mainWindow = nil;
- }
- @end
|