self.window не работает внутри контроллера представления

Для iOS 7 у меня была проблема со строкой состояния. Для этого я решил это, используя приведенный ниже код в Appdelegate.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleLightContent];
    self.window.clipsToBounds =YES;
    self.window.frame =  CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    self.window.bounds = CGRectMake(0,0, self.window.frame.size.width, self.window.frame.size.height);
}

Все работает отлично.

Только это создает проблемы при фотографировании.

Когда я открываю камеру или фотогалерею, я все еще вижу строку состояния, и из-за этого я вижу половину заголовка навигации, как показано ниже.

введите здесь описание изображения

Любая идея, как я могу преодолеть эту ошибку?

Проблемы:

  1. Фотогалерея/Камера выглядит как на изображении выше

  2. Если я нажму «Отмена», мой вид автоматически сдвинется на 20 пикселей вверх.


person Fahim Parkar    schedule 22.10.2013    source источник
comment
@sathiamoorthy: код, пожалуйста... Я не понимаю, что ты имеешь в виду...   -  person Fahim Parkar    schedule 22.10.2013


Ответы (3)


Я столкнулся с этой проблемой с одним из моих проектов. У нас даже не было xib для многих классов. Так что все, что я мог сделать, это еще раз сбросить кадр в функциях делегата.

   [self.navigationController dismissViewControllerAnimated:YES
                                              completion:^{
                                                  [self.navigationController.view setFrame:CGRectMake(self.navigationController.view.frame.origin.x, [UIApplication sharedApplication].statusBarFrame.size.height, self.navigationController.view.frame.size.width, [[UIScreen mainScreen] bounds].size.height-[UIApplication sharedApplication].statusBarFrame.size.height)];
                                              }];

Я поместил это в методы завершения/отмены делегирования пикета фото/камеры, сборщика почты.

person Ramaraj T    schedule 23.10.2013
comment
Зачем вам сбрасывать, когда вы можете указать навигационному контроллеру, какой у него rootviewcontroller и т. д. Фрейм будет установлен сам по себе. Я сделал то же самое без сброса. - person Abdul Naveed; 23.10.2013
comment
Спасибо... Спасибо... Спасибо... Спасибо... Спасибо... Спасибо... Спасибо... Спасибо... Спасибо... Почему вы не встретил меня вчера ;) Я потратил на это 4 часа... спасибо, чувак... - person Fahim Parkar; 23.10.2013
comment
@Suresh: Теперь я столкнулся с одной проблемой ... Когда я добавляю какую-то фотографию и пытаюсь снова добавить новую фотографию, все беспорядок идет ... когда я пытаюсь загрузить второе изображение и нажимаю «Отмена» или «Загрузить изображение», просмотр сбрасывается. все идет наверх - person Fahim Parkar; 23.10.2013
comment
Вы также должны поместить код в imagePickerControllerDidCancel. - person Ramaraj T; 23.10.2013

Вместо:

self.window 

Использовать это:

[[self view] window]

Попробуйте вот так:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    [[UIApplication sharedApplication] setStatusBarStyle: UIStatusBarStyleLightContent];
    self.view.window.clipsToBounds =YES;
    self.view.window.frame =  CGRectMake(0,20,self.view.window.frame.size.width,self.view.window.frame.size.height-20);
    self.view.window.bounds = CGRectMake(0,0, self.view.window.frame.size.width, self.view.window.frame.size.height);
}
person PR Singh    schedule 22.10.2013
comment
но вы упомянули, что он не работает внутри контроллера представления, как указано в заголовке вопроса. - person PR Singh; 22.10.2013
comment
извините за это ... посмотрите мой обновленный вопрос ... надеюсь, вы поняли, в чем проблема ... если нет, дайте мне знать, я обновлю вопрос - person Fahim Parkar; 22.10.2013
comment
ты нашел решение? - person Fahim Parkar; 22.10.2013

Я предполагаю, что вы используете UINavigationController. Нет ничего общего с фреймом или что-то делать со строкой состояния, если вы используете UINavigationController. Пожалуйста, предпочтите приведенный ниже код для установки UINavigationController вместе с настройкой строки состояния. В противном случае вы можете отобразить код, который поможет вам исправить это.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    [[UIApplication sharedApplication] setStatusBarHidden:NO];
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleBlackOpaque];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[ExViewController alloc] initWithNibName:@"ExViewController" bundle:nil];
    self.window.rootViewController = self.viewController;

    self.mainViewNavigation = [[UINavigationController alloc] initWithRootViewController:self.viewController];
    self.window.rootViewController = mainViewNavigation;


    [self.window addSubview:self.mainViewNavigation.view];
    [self.window makeKeyAndVisible];
    return YES;
}
person Abdul Naveed    schedule 23.10.2013
comment
Ответ заключается в настройке rootviewcontroller для navigationController и так далее. Независимо от того, где вы его используете - person Abdul Naveed; 23.10.2013