BKPasscodeLockScreenManager.m 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. //
  2. // BKPasscodeLockScreenManager.m
  3. // BKPasscodeViewDemo
  4. //
  5. // Created by Byungkook Jang on 2014. 8. 2..
  6. // Copyright (c) 2014년 Byungkook Jang. All rights reserved.
  7. //
  8. #import "BKPasscodeLockScreenManager.h"
  9. #import "BKPasscodeViewController.h"
  10. static BKPasscodeLockScreenManager *_sharedManager;
  11. @interface BKPasscodeLockScreenManager ()
  12. @property (strong, nonatomic) UIWindow *mainWindow;
  13. @property (strong, nonatomic) UIWindow *lockScreenWindow;
  14. @property (strong, nonatomic) UIView *blindView;
  15. @end
  16. @implementation BKPasscodeLockScreenManager
  17. + (BKPasscodeLockScreenManager *)sharedManager
  18. {
  19. static dispatch_once_t onceToken;
  20. dispatch_once(&onceToken, ^{
  21. _sharedManager = [[BKPasscodeLockScreenManager alloc] init];
  22. });
  23. return _sharedManager;
  24. }
  25. - (void)showLockScreen:(BOOL)animated
  26. {
  27. NSAssert(self.delegate, @"delegate is not assigned.");
  28. if (self.lockScreenWindow && self.lockScreenWindow.rootViewController) {
  29. return;
  30. }
  31. if ([self.delegate respondsToSelector:@selector(lockScreenManagerShouldShowLockScreen:)]) {
  32. if (NO == [self.delegate lockScreenManagerShouldShowLockScreen:self]) {
  33. return;
  34. }
  35. }
  36. // get the main window
  37. #ifndef EXTENSION
  38. self.mainWindow = [[UIApplication sharedApplication] keyWindow];
  39. // dismiss keyboard before showing lock screen
  40. [self.mainWindow.rootViewController.view endEditing:YES];
  41. #endif
  42. // add blind view
  43. UIView *blindView;
  44. if ([self.delegate respondsToSelector:@selector(lockScreenManagerBlindView:)]) {
  45. blindView = [self.delegate lockScreenManagerBlindView:self];
  46. }
  47. if (nil == blindView) {
  48. blindView = [[UIView alloc] init];
  49. blindView.backgroundColor = [UIColor whiteColor];
  50. }
  51. blindView.frame = self.mainWindow.bounds;
  52. blindView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
  53. [self.mainWindow addSubview:blindView];
  54. self.blindView = blindView;
  55. // set dummy view controller as root view controller
  56. BKPasscodeDummyViewController *dummyViewController = [[BKPasscodeDummyViewController alloc] init];
  57. UIWindow *lockScreenWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  58. lockScreenWindow.windowLevel = self.mainWindow.windowLevel + 1;
  59. lockScreenWindow.rootViewController = dummyViewController;
  60. lockScreenWindow.backgroundColor = [UIColor clearColor];
  61. [lockScreenWindow makeKeyAndVisible];
  62. // present lock screen
  63. UIViewController *lockScreenViewController = [self.delegate lockScreenManagerPasscodeViewController:self];
  64. if (animated) {
  65. blindView.hidden = YES;
  66. }
  67. [lockScreenWindow.rootViewController presentViewController:lockScreenViewController animated:animated completion:^{
  68. blindView.hidden = NO;
  69. }];
  70. self.lockScreenWindow = lockScreenWindow;
  71. [lockScreenViewController.view.superview bringSubviewToFront:lockScreenViewController.view];
  72. dummyViewController.delegate = self;
  73. }
  74. - (void)dummyViewControllerWillAppear:(BKPasscodeDummyViewController *)aViewController
  75. {
  76. // remove blind view
  77. [self.blindView removeFromSuperview];
  78. self.blindView = nil;
  79. }
  80. - (void)dummyViewControllerDidAppear:(BKPasscodeDummyViewController *)aViewController
  81. {
  82. if ([UIView instancesRespondToSelector:@selector(tintColor)]) {
  83. self.lockScreenWindow = nil;
  84. } else {
  85. [self performSelector:@selector(setLockScreenWindow:) withObject:nil afterDelay:0.1f]; // workaround for wired dealloc on iOS 6
  86. }
  87. [self.mainWindow makeKeyAndVisible];
  88. self.mainWindow = nil;
  89. }
  90. @end