2009-07-11 2 views
22

Как я могу изменить размер изображения в ответ на строку состояния вызова в моем телефоне?Изменение размера для строки состояния вызова?

Я полагал, что это будет просто настройка свойств изменения размера, но они не включены для корневого UIView.

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

ответ

6

Что делать вы имеете в виду, когда говорите, что «свойства изменения размера не включены для корневого UIView»?

В строке состояния вызова нет специального специального обозначения, и я не думаю, что вокруг него есть какие-либо API-интерфейсы или уведомления. Вместо этого ваши взгляды должны быть просто настроены для автоматической проверки правильности.

Попробуйте создать новое приложение на основе навигации в Xcode и изучите параметры авторазрезания в представлении таблицы в RootViewController.xib. Надеюсь, вы увидите дельта между тем, что установлено Apple и тем, что вы установили в своем проекте.

+0

Я, вероятно, тоже использую неправильный термин. В принципе, у меня есть xib с UIView. Выбрав UIView и посмотрев на свойства изменения размера, я могу щелкнуть по соединениям «сверху/снизу» и «влево/вправо», но горизонтальные и вертикальные по центру не реагируют на щелчки. –

+0

Создал новый UIView в xib, и я могу манипулировать им. Кажется, что-то не так с этим UIView в xib. Будем экспериментировать немного больше и отмечать это как решение, если это так. –

+0

Да, похоже, что что-то не так с UIView. Благодарю. –

16

вы ищете - [UIApplication statusBarFrame] и, в вашем UIApplicationDelegate, вы должны реализовать этот метод делегата, чтобы получать уведомления о том, когда изменения каркасных строки состояния:

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 
+1

Майк, вы можете уточнить: означает ли это, что я должен вручную изменить размеры элементов на моих представлениях в коде? Удушье! –

+1

Я не понимаю, почему, если свойства авторезизации вашего представления правильно установлены. Но да, написание кода - какое ужасное неудобство. :-) –

+0

Маркировка другой принята, потому что он указал, что то, что я пытаюсь сделать *, должно было работать сначала, но спасибо вам большое. :) –

3

Для таких видов, как UITableView, вам обычно необходимо изменить высоту ячейки таблицы, и нет другого способа сделать это, кроме как реализовать приложение : didChangeStatusBarFrame:. Но это не biggie, и вы, , можете установить высоту строки в нецелые значения, если вам нужно.

+0

За исключением того, что приложение: didChangeStatusBarFrame: и сопровождающее уведомление никогда не отправляется для простой смены статуса. Попробуй :-) –

+0

Я заметил, что когда я обернулся, чтобы попробовать. Итак, как мы справляемся с изменением размера экрана? Интерфейс моего приложения скользит вниз, но частично скрывается в этом процессе. –

0

Решения убедиться, что вы сделали свой ключ окна:

[window makeKeyAndVisible]; 

Если вы не сделаете, что подтаблицы не получают изменены автоматически, но нет никаких других симптомов, насколько я знаю.

1

У меня была такая же проблема. Я сделал это.

  1. Открыть файл XIB в IB
  2. Все элементы интерфейса, по умолчанию прилагается двигаться вместе с верхними и показано в свойстве «Autosizing» в «Размер инспектора». Итак, для элементов пользовательского интерфейса в нижней части экрана удалите ссылку сверху и вместо этого сделайте ссылку снизу. Оставь все остальное как есть.
  3. Проблема решена !!!

Надеюсь, я был чист.

+0

Теперь мой взгляд не отображается, если я делаю ссылку внизу. –

+0

Нет, это не работает для меня –

24

iOS будет вызывать ваш viewController's viewWillLayoutSubviews при каждом изменении строки состояния. Вы можете переопределить это и настроить свои объекты в соответствии с новыми границами.

- (void)viewWillLayoutSubviews { 
    // Your adjustments accd to 
    // viewController.bounds 

    [super viewWillLayoutSubviews]; 
} 
+0

Ну, если вы измените границы здесь, это 'viewWillLayoutSubviews' будет вызываться снова рекурсивно. – Rivera

+0

странно, что viewController уведомлен, но он не изменяется, высота сбрасывается, любая идея почему? –

+0

Отлично! Вы можете обновить свой ContentFrame, который вы можете использовать в качестве константы в вашем UIViewController, а также для self.view.bounds, поэтому смещение распространяется по всей вашей иерархии представлений. –

7

Просмотр не может быть изменен автоматически при изменении размера строки состояния, если у вас нет контроллера корневого представления. Первоначально я это делал в своем делете приложения, и мое приложение работало правильно во всех отношениях, за исключением того, что во время телефонных звонков оно не изменилось бы правильно.

[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 
+0

Большое вам спасибо! Это определенно решило мою проблему. – GeRyCh

+0

OMG это! Это решило мою проблему, потратив часы на настройку свойств полного экрана почти всего! – ArkReversed

7

это работает для меня идеально, когда мое приложение работает в фоновом режиме и жмем Ctrl + 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; 
}]; 

}

+0

Это не обязательно. Я думаю, что есть ошибка в шаблонах Xcode. Я исправил его, удалив + воссоздав контроллер вида. Новый отвечает так, как я ожидал. –

+0

Я исправил его, в моем случае я нажал контроллер панели вкладок внутри контроллера навигации, поэтому он вызывал проблемы. Теперь он работает без проблем. Теперь контроллер панели вкладок - это мой корневой контроллер, и я перенастраиваю представление своего контроллера навигации внутри контроллера панели вкладок. – user1544494

+0

Спасибо за его работу для меня. Спасибо :) – ilesh

0

Ни одно из решений, размещенных до того работал для меня. Что для меня работало, так это то, что у меня не было ограничений, установленных для моих взглядов. В моей ситуации у меня было два разных вида контейнера в моем представлении.

View of scene in storyboard.

Дно (в списке) зрения контейнера был UITableView, который не был правильно прокрутки в нижней части таблицы. Причина заключалась в том, что смещение строки состояния в вызове вызывало начало координат (верхний левый угол) UITableView, но размер оставался бы таким же. Это означало, что нижняя часть таблицы была выключена!

Решение было правильно установить Autoresizing ограничение высоты должным образом. На скриншоте ниже это вертикальные стрелки в середине окна Autoresising.

enter image description here

+0

Моя первоначальная проблема, назад, когда, было то, что эти стрелки были просто недоступны. Я никогда не выяснял, почему, но воссоздал вид в контроллере представления, зафиксировал его. –

+0

@StevenFisher, котор нужно знать! Благодаря! – mikeho

2

Уведомление о строке состояния изменяющегося кадра

UIApplicationWillChangeStatusBarFrameNotification

Регистрация в качестве наблюдателя:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

Затем реагировать на изменения в обработчике:

- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }

Даже при правильной установке автозапуска, возможно, потребуется отреагировать на изменения. Например, табличное представление, которое вычисляет высоту своей ячейки на основе заданного пространства на экране, может понадобиться reloadData после изменения строки состояния.

Documentation

1

Вы должны обновить точку вручную, если вы настраиваете ваши фреймы программно

-(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]; 
} 

Это дает вам новую высоту строки состояния и с помощью этого вы можете обновить кадры соответственно.