Размещение UIView или UIWindow над строкой состояния

Моя цель - нарисовать невидимую кнопку над строкой состояния в верхней части моего приложения для iPhone (размер 320 * 20 пикселей).

Что ни пытаюсь, что-то глючит:

  1. Например, я попытался создать новый вид. Когда я хочу разместить представление в верхней части приложения, оно всегда исчезает за строкой состояния, а не перед ней!

  2. Я нашел еще одну отличную идею в Stackoverflow: Добавить UIView поверх всех других представлений, включая StatusBar Даже если второй UIWindow не рекомендуется, я попытался его реализовать. Все работало так, как я хотел, до того момента, как я заметил проблему: клавиатура больше не появляется, когда это необходимо (например, при нажатии на текстовое поле)!

Как я могу это исправить? Или есть лучший подход к моей проблеме? Это мой код для создания второго окна:

// Create window
statusWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0,0,320,20)];
statusWindow.windowLevel = UIWindowLevelStatusBar;
[statusWindow makeKeyAndVisible];

// Create statusBarButton
statusBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect buttonFrame2 = statusBarButton.frame;
buttonFrame2.size = CGSizeMake(320,20);
statusBarButton.frame = buttonFrame2;
[statusBarButton addTarget:self action:@selector(goTop) forControlEvents:UIControlEventTouchUpInside]; 

// Place button into the new window
[statusWindow addSubview:statusBarButton];

person andreas    schedule 23.11.2010    source источник


Ответы (4)


В документации для - [UIWindow makeKeyAndVisible]:

Это удобный способ сделать приемник главным окном и отображать его поверх других окон. Вы также можете скрывать и открывать окно, используя унаследованное свойство hidden от UIView.

«Ключевое окно» - это то окно, которое получает определенные входные события; текстовые поля в неключевом окне могут не работать. Вы можете сделать две вещи:

  • После этого вызовите [window makeKeyAndVisible] в старом ключевом окне
  • Вместо этого установите statusWindow.hidden = NO (но я не понимаю, почему он будет скрыт по умолчанию). Я не думаю, что вы можете «отображать его перед другими окнами», как это делает -makeKeyAndVisible; в окнах нет супервизора, который вы можете вызвать -bringSubviewToFront: на IIRC.
person tc.    schedule 23.11.2010
comment
Привет, это великолепно! Сначала я не верил, что это может сработать, но это действительно так! Большое спасибо за сэкономленное время и разочарование! :-) - person andreas; 24.11.2010
comment
Какой метод вы в конечном итоге использовали? - person tc.; 24.11.2010
comment
См. Мой последний пост: мне пришлось удалить команду statusWindow makeKeyAndVisible и использовать вместо этого statusWindow.hidden = NO. В конце всего кода я добавил окно makeKeyAndVisible, чтобы приложение знало, что оно должно отображать там клавиатуру. Это сработало! Надеюсь, Apple примет это решение. - person andreas; 25.11.2010
comment
Он не использует никаких частных API, поэтому Apple вряд ли откажется от него. Немного беспокоит то, что вы можете разместить окно над строкой состояния. OTOH, ничто не мешает вам скрыть реальную строку состояния и отобразить клон, так что это тоже не представляет большого риска для безопасности. - person tc.; 27.11.2010

в файле AppDelegate

self.window.windowLevel = UIWindowLevelStatusBar;

или в любом другом классе

[AppDelegate appDelegate].window.windowLevel = UIWindowLevelStatusBar;

и если вы хотите, чтобы строка состояния снова была наверху, вы можете установить

self.window.windowLevel = UIWindowLevelNormal;
person Mihriban Minaz    schedule 05.06.2014

Если другие пользователи хотят это реализовать, вот мое решение:

// Create window
statusWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0,0,320,20)];
statusWindow.windowLevel = UIWindowLevelStatusBar;
// Dont make the statusWindow keyWindow or the keyboard won't work!
// [statusWindow makeKeyAndVisible];

// Create statusBarButton
statusBarButton = [UIButton buttonWithType:UIButtonTypeCustom];
CGRect buttonFrame2 = statusBarButton.frame;
buttonFrame2.size = CGSizeMake(320,20);
statusBarButton.frame = buttonFrame2;
[statusBarButton addTarget:self action:@selector(goTop) forControlEvents:UIControlEventTouchUpInside]; 

// Place button into the new window
[statusWindow addSubview:statusBarButton];

// Instead, add this:
[window makeKeyAndVisible]; // has to be main window of app
statusWindow.hidden = NO; // without this the statusWindow won't appear
person andreas    schedule 23.11.2010
comment
Этот код не работает. Насколько я могу судить, вы не добавляете statusWindow в свою иерархию представлений. Как сделать так, чтобы это появилось? - person jbrennan; 02.12.2010
comment
Я объявил window и statusWindow в моем h-файле и сделал синтез в моем m-файле. Больше ничего не было сделано, насколько я проверил! Обратите внимание, что моя кнопка невидима и находится только в верхней части строки состояния и вызывает функцию goTop, которую необходимо объявить. Поворот приложения iPhone также запутает это, поэтому вам придется изменить размер кнопки. - person andreas; 08.12.2010
comment
У меня это тоже не работает, этот код находится в AppDelegate? - person JP Illanes; 11.06.2012

Пытаться:

[self.view bringSubviewToFront:statusWindow];

Я не думаю, что можно вывести представление перед строкой состояния.

person WrightsCS    schedule 23.11.2010
comment
К сожалению, заставить его работать не удалось. Единственный способ сделать это - добавить новый (что обычно не рекомендуется!). - person andreas; 24.11.2010