Жест двойного касания в строке состояния

Я сделал свое самое первое приложение (простой респринг) с Theos, в настоящее время оно работает, нажав на значок, но я хочу переделать его без значка (в качестве настройки), и чтобы телефон дышал, когда я дважды нажимаю на задачу. бар.

Вопрос: как добавить жест двойного нажатия на панель состояния/задач?

Спасибо.


person Nicoll    schedule 11.11.2014    source источник


Ответы (4)


Есть несколько способов. Вы можете использовать пользовательские события или фиксировать касания в класс делегата вашего приложения как здесь

Хорошо, ваш ответ намного проще. Здесь будет полезна реализация метода -(BOOL)scrollViewShouldScrollToTop: для вашей задачи.

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
  tapIndex++; // class member
  if(tapIndex==2)
  {
    [self statusBarDoubleTapped];
    tapIndex=0;
  }
  else
  { 
    NSTimeInterval interval = 1; // one second wait for the second tap
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
           if(tapIndex==1) // one second since the only status bar tap
             tapIndex=0;
        });
  }
  return NO; // don't scroll to top
}
person Daniyar    schedule 11.11.2014
comment
Спасибо, а нет ли более простого способа? Я думал, что мне понадобится libstatusbar? Я очень новичок в Objective-C и не понимаю информации по этим ссылкам, но не очень ли они старые (IOS4)? - person Nicoll; 11.11.2014
comment
Думаю, проще некуда. Строка состояния не является частью вашего приложения, и для изменения ее свойств должен быть какой-то API. Похоже, что libstatusbar предназначен для визуализации, а не для настройки функциональности. - person Daniyar; 11.11.2014
comment
Хорошо, спасибо Астория, так что мне придется забыть об этом, пока я не узнаю намного больше о Objective-C, чтобы я мог лучше понять, о чем говорят сообщения. - person Nicoll; 11.11.2014
comment
Еще раз спасибо, Астория, я попробую это. - person Nicoll; 11.11.2014

Я нашел этот код, в какой файл в моем приложении theos он войдет?

- (void)viewDidLoad {
[super viewDidLoad];
// required
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectZero];
scrollView.delegate = self;
scrollView.contentSize = CGSizeMake(0.0f,1.0f);
[scrollView setContentOffset:CGPointMake(0.0f,1.0f) animated:NO];
// optional
scrollView.scrollsToTop = YES; // default is YES.
[self.view addSubview:scrollView];
}

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
NSLog(@"Detect status bar is touched.");
/* Your own code. */
return NO;
}
person Nicoll    schedule 11.11.2014
comment
Да, ты прав. Вот и ответ, нашел только сейчас. Вы должны пометить мой ответ как неверный. - person Daniyar; 11.11.2014
comment
Еще раз извините, что беспокою! Это входит в файл RootViewController.mm? Я получаю сообщение об ошибке при попытке создать пакет: реализация свойства должна иметь объявление в интерфейсе 'testappApplication. И где я могу добавить систему (killall -9 SpringBoard); код в этом? Большое спасибо за вашу помощь. - person Nicoll; 11.11.2014
comment
Да, это относится к реализации вашего класса контроллера представления. К сожалению, не могу найти, почему вы получаете это сообщение. Вы не должны использовать расширение .mm (кроме того, если вы используете код С++ внутри) кстати. - person Daniyar; 11.11.2014

Это полный файл:

#import "RootViewController.h"

@implementation RootViewController
- (void)loadView {
self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
self.view.backgroundColor = [UIColor redColor];

- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    tapIndex++; // class member
    if(tapIndex==2)
    {
        [self statusBarDoubleTapped];
        tapIndex=0;

        system("killall -9 SpringBoard");
    }
    else
    {
        NSTimeInterval interval = 1; // one second wait for the second tap
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(interval * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            if(tapIndex==1) // one second since the only status bar tap
                tapIndex=0;
        });
    }
    return NO; // don't scroll to top
}

//- (void)launch { system("killall -9 SpringBoard");
}
@end
person Nicoll    schedule 11.11.2014

Вот что я сделал на iOS 11, используя Swift 4.

let statusBarWindow = UIApplication.shared.value(forKey: "statusBarWindow") as! UIWindow
let statusBar = statusBarWindow.subviews.first

let doubleTap = UITapGestureRecognizer(target: self, action: #selector(handle(doubleTapStatusBar:)))
doubleTap.numberOfTapsRequired = 2
statusBar?.addGestureRecognizer(doubleTap)
person BumMo Koo    schedule 21.01.2018