加一条:老大提醒,在面向对象的编程语言里面最好不要有无从属关系的全局变量,被各处引用~不好!
如何自定义一个time interval 在用户停止任何操作后延迟触发锁屏操作,跳转到自定义的锁屏界面,蛋痛中。。。
思路:
1)- (void)applicationWillResignActive:(UIApplication *)application //(现在了解到 此为错误想法)
说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了 (但还未找到如何设置从active到inactive的时间间隔!!!)
2)首先:设置一个NSTimer 定时器。
然后:设置一个UIResponder 捕获各个View 下面的
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//NSTime 置零
}
最后:在一个主线程里(还不确定在哪,初步定在Appdelegate.m中)根据NSTime的值判断跳转至自己写的锁屏界面。
总结:可行性高,设计复杂。
实现:未完待续。。。。
结果:搞定~~ 哈哈哈
总结下实现过程,为后人提供些许思路也好~(菜鸟一枚)
1)首先想到的是,定义一个全局的计时器NSTimer, 然后在进入各个view视图时计时开始,然后捕获USER 的触摸和输入操作,将计时器清零。可惜,经查证,NSTimer只能在一个Thread里面进行计时的开始与停止的操作。跨线程无效。然后就想在main thread里面起一个计时器,在各线程下对该NSTimer进行操作,又可惜。。。太菜,不会弄。
定时器的具体实现:在Appdelegate里面,添加startTimer、zeroTimer、gotoLockScreen的方法。
- (void)lockSecBrowserScreen
{
LOGNOTICE(@"go to lock screen ");
if (currentViewController) {
ScreenLockViewController *lockScreen = [[ScreenLockViewController alloc] init];
LOGNOTICE(@"appdelegate.delegate : %@",currentViewController);
[currentViewController presentModalViewController:lockScreen animated:YES];
}
}
//tap gesture action
- (void)zeroTimer{
LOGNOTICE(@"capture gesture & set timer zero");
if (!g_timeCount) {
g_timeCount = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:nil userInfo:nil repeats:NO];
}
[g_timeCount invalidate];
g_timeCount = nil;
}
//start the NSTimer
- (void)startTimer {
LOGNOTICE(@"NSTimer start");
BOOL enableSecBrowserScreen = YES;
if (enableSecBrowserScreen) {
if (!g_timeCount) {
screenLockTimeInterval = 15;
g_timeCount = [NSTimer scheduledTimerWithTimeInterval:screenLockTimeInterval target:self selector:@selector(lockSecBrowserScreen) userInfo:nil repeats:YES];
}
}
}
然后在进入每个视图后,自己是添加在判断是否横竖屏切换的函数里(只要进视图,无论以任何方式都会走该函数(popover除外)),创建appdelegate的实例,赋值为UIApplication的delegate,调用zeroTimer并startTimer(程序架构已经写好,所以说这边封装的不好,频繁调用重复的操作),并将appdelegate的实例的currentviewcontroller设为self。至此,计时器部分完成。
然后,就是用户交互的识别。
1.Touch:捕获用户的touch操作,可以在appdelegate里面subclass系统的UIWindow类,重写- (void)sendEvent:(UIEvent *)event系统函数
实现:
@iinterface myWindow:UIWindow
@end
@implementation myWindow
- (void)sendEvent:(UIEvent *)event
{
AppDelegate *appdelegate = [UIApplication sharedApplication].delegate;
if (appdelegate.isInBrowser) {
if (event.type == UIEventTypeTouches || event.type == UIEventTypeMotion || event.type == UIEventTypeRemoteControl) {
//set NSTimer zero and count again
LOGNOTICE(@"Set Timer Zero & Fire Again According USER TAPS");
[appdelegate zeroTimer];
[appdelegate startTimer];
}
}
[super sendEvent:event];
}
2) 键盘的input:当用户在UITextfield里面输入字符,触摸键盘时,是不会被识别为Window的手势操作。就需要在消息机制里捕获键盘输入。然后在selector自己的方法,实现想要进行的操作(stopTime,startTime)
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textfieldChanged) name:UITextFieldTextDidChangeNotification object:_nameTextField];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textfieldChanged) name:UITextFieldTextDidBeginEditingNotification object:_nameTextField];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(textfieldChanged) name:UITextFieldTextDidEndEditingNotification object:_nameTextField];
OVER~!!
(水平有限,仅以提供思路为准则)