Границы UIWindow / фрейм равны нулю

#iphone #ios #xcode4.2

#iPhone #iOS #xcode4.2

Вопрос:

Я создаю приложение ios без файлов nib и хочу инициализировать окно в делегате приложения следующим образом:

 CGRect screenBounds = [[UIScreen mainScreen] bounds];
self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];
self.window.backgroundColor = [UIColor greenColor];

NSLog(@"%@", self.window.bounds);
  

Появляется окно, и я вижу зеленый цвет, который я определил. Когда я отлаживаю self.window, я вижу границы фрейма, который я только что определил, но когда я хочу получить доступ к свойству bounds, оно возвращает null. То же самое с frame. В чем разница?

Когда я хочу инициализировать представление следующим, оно не будет работать, потому что фрейм / границы не определены для инициализации этого представления:

 // create root view
RootView* rootView = [[[RootView alloc] initWithFrame:self.window.bounds] autorelease];
  

Что я делаю не так?

Ответ №1:

Да, это не сработает

 NSLog(@"%@", self.window.bounds);
  

Границы окна не являются объектом, поэтому %@ нельзя использовать для его отображения 🙂

Попробуйте преобразовать CGRect в NSString * первый :

 NSLog(@"%@", NSStringFromCGRect(self.window.bounds));
  

Это должно дать вам немного больше отладочной информации, которая поможет вам решить вашу проблему 🙂

NB %@ просто вызывает description объект и отображает его.

Ответ №2:

Вы должны использовать спецификаторы формата для NSLog фрейма:

 NSLog(@"x=%.1f, y=%.1f, width=%.1f, height=%.1f", 
      self.window.bounds.origin.x, 
      self.window.bounds.origin.y, 
      self.window.bounds.size.width, 
      self.window.bounds.size.height);
  

Комментарии:

1. Для этого есть вспомогательный метод — NSStringFromCGRect 🙂 Подробнее см. Документы здесь: developer.apple.com/library/ios/#documentation/uikit/reference /…