Если вы хотите добавить прослушиватель событий для нажатия кнопки, просто выберите кнопки и добавьте прослушиватели в цикле:
document.querySelectorAll("button").forEach(e => e.addEventListener("click", myFunc));
Кроме того, прослушайте любой щелчок, а затем проверьте, если событие цель - кнопка:
document.addEventListener("click", (e) => if (e.target.tagName == "BUTTON") myFunc());
Что вы имеете в виду, когда говорите, что «свойства изменения размера не включены для корневого UIView»?
Строка состояния при вызове не имеет какого-либо специального специального обозначения, и я не Не думаю, что есть какие-либо API или уведомления вокруг него. Вместо этого ваши представления должны быть просто настроены на автоматическое изменение размера.
Попробуйте создать новое приложение на основе навигации в XCode и изучите параметры авторазмера в табличном представлении в RootViewController.xib. Надеюсь, вы увидите разницу между тем, что установлено Apple, и тем, что вы установили в своем проекте.
Вы ищете - [UIApplication statusBarFrame], и в своем UIApplicationDelegate вы должны реализовать этот метод делегата, чтобы получать уведомления о том, когда изменяется рамка строки состояния:
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
Вид может не изменяться автоматически при изменении размера строки состояния, если у вас не установлен контроллер корневого представления. Первоначально я имел это в своем делегате приложения, и мое приложение работало должным образом во всех отношениях, за исключением того, что оно не будет корректно изменяться во время телефонных звонков.
[self.window addSubview:rootController.view];
Я изменил вышеприведенную строку на эту, и теперь мое приложение автоматически изменяет размеры во время звонков.
[self.window setRootViewController:rootController];
Я обнаружил это исправление, увидев это в журнале и выяснив причину.
Application windows are expected to have a root view controller at the end of application launch
это прекрасно работает для меня, когда мое приложение работает в фоновом режиме, и я нажимаю команду + T. В моем сценарии корневой контроллер - это контроллер панели вкладок, и я перенастраиваю свой контроллер навигации внутри каждой вкладки.
- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{
[UIView animateWithDuration:0.35 animations:^{
CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame;
if (newStatusBarFrame.size.height > 20) {
windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20
}
else{
windowFrame.origin.y = 0.0;
}
((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame;
}];
}
Для таких представлений, как UITableView, вам обычно нужно изменить высоту ячейки таблицы, и нет другого способа сделать это, кроме как реализовать приложение : didChangeStatusBarFrame: . Но это не важно, и вы можете установить высоту строки на нецелые значения, если вам нужно.
Уведомление об изменении фрейма строки состояния:
UIApplicationWillChangeStatusBarFrameNotification
Зарегистрироваться в качестве наблюдателя:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
Затем ответить на изменение в вашем обработчике:
- (void)statusBarFrameWillChange:(NSNotification*)notification
{
// respond to changes
}
Даже при правильной настройке автоматического размещения, вам может потребоваться реагировать на изменения. Например, табличное представление, которое вычисляет высоту своей ячейки на основе заданного пространства на экране, может нуждаться в reloadData
после изменения строки состояния.
У меня была такая же проблема. То, что я сделал, было этим.
Надеюсь, что все ясно.
Вам придется обновлять виды вручную, если вы устанавливаете свои рамки просмотра программно
-(void) viewDidAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];
}
- (void)statusBarFrameWillChange:(NSNotification*)notification
{
// respond to changes
NSLog(@"STATUS BAR UPDATED");
NSDictionary *statusBarDetail = [notification userInfo];
NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey];
CGRect statusBarFrameBeginRect = [animationCurve CGRectValue];
int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width;
NSLog(@"status bar height %d", statusBarHeight);
}
-(void) viewDidDisappear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil];
}
Это дает вам новую высоту строки состояния, и с ее помощью вы можете соответствующим образом обновить свои рамки.
Решение состоит в том, чтобы убедиться, что вы сделали свой ключ окна:
[window makeKeyAndVisible];
Если вы этого не сделаете, размер подпредставления не изменится автоматически, но, насколько я знаю, других симптомов нет .
Ни одно из ранее опубликованных решений не сработало для меня. Что сработало для меня, так это то, что у меня не были должным образом установлены ограничения для моих взглядов. В моей ситуации у меня было два разных вида контейнера.
Нижний (в списке) вид контейнера был UITableView
, который не прокручивался правильно до нижней части таблицы. Причина заключалась в том, что смещение строки состояния вызова вызывало изменение источника (левый верхний угол) UITableView
, но размер оставался таким же. Это означало, что нижняя часть таблицы была за кадром!
Решением было правильно установить ограничение высоты Autoresizing . На скриншоте ниже это вертикальные стрелки в середине поля Авторазмер .