Изменения UIInterfaceOrientation не работают в подпредставлениях

Я добавляю изменения UIInterfaceOrientation в приложение. Мое приложение не основано на вкладках или навигации. Я добавляю подвиды поверх других.

Я просмотрел документ, почему не работает изменение ориентации интерфейса? http://developer.apple.com/library/ios/#qa/qa1688/_index.html

Я обнаружил, что главное окно управляет изменением ориентации интерфейса.

Но теперь, когда мое приложение не основано на вкладках или навигации, есть ли способ добиться этого?

P.S. : В моем приложении правильно работают только экраны запуска для изменения ориентации интерфейса, а не добавленные подпредставления.

Пожалуйста помоги

Заранее спасибо.


person iOSDev    schedule 11.05.2012    source источник


Ответы (2)


Используйте следующий метод для изменения размера подпредставления. ИЛИ используйте autoresizingMask

 -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
  {
    if(toInterfaceOrientation == UIInterfaceOrientationPortrait){

        viewInformationContainer.frame = CGRectMake(0, 61, 320, 403);// here you can change resize or subviews


    }
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight || toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {

        viewInformationContainer.frame = CGRectMake(0, 0, 480, 227);//here you can change resize or subviews


        }
}

Надеюсь, что это поможет вам...

person Nitin    schedule 11.05.2012
comment
Только что попробовал, но этот метод не вызывается ни в одном из моих подвидов. Требуется ли, чтобы все родительские представления имели этот метод? - person iOSDev; 11.05.2012
comment
Нет, я предполагаю, что он не вызывается, когда вы переключаете представления, или вы забыли добавить два метода, как я показал в отредактированном коде. - person Nitin; 11.05.2012
comment
Обновление: только что попробовал добавить этот метод во все представления. Что происходит, так это то, что компоненты пользовательского интерфейса вращаются правильно. Но я также меняю фоновое изображение на ландшафт, и оно не меняется, потому что код не вызывается. Компоненты пользовательского интерфейса устанавливаются с помощью автоматического изменения размера. Что можно сделать в этом случае? - person iOSDev; 11.05.2012
comment
Это зависит от того, как вы добавили фоновое изображение. Если вы также должны установить свойство автоматического изменения размера для этого фона UIImageView. Без вашего кода я ничего не могу вам сказать. Это должно работать и попробуйте прочитать руководство по автоматическому изменению размера. - person Nitin; 11.05.2012
comment
Я не понял... Я устанавливаю фоновое изображение следующим образом: self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@ipad-landscape.png]]; Но если код не вызывается, он не изменится. и я хочу изменить его. - person iOSDev; 11.05.2012
comment
Вы установили свойство автоматического изменения размера для основного вида или нет? Потому что это должно работать. - person Nitin; 11.05.2012
comment
Да я это сделал! Но по-прежнему метод не вызывается, и фоновое изображение не меняется при изменении ориентации. - person iOSDev; 11.05.2012

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

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

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

Однажды я добавил базовый контроллер представления в окно своего приложения, где у базового контроллера был ScrollView , позже я добавил подвиды моих четырех контроллеров представления в scrollview.

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

  • (недействительно) viewDidLoad {

    DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
    
    CGRect viewCustormFrame = appDelegate.viewCustomTabBar.frame;
    viewCustormFrame.origin.y = self.view.frame.size.height-35;
    
    if(UIInterfaceOrientationIsPortrait([UIApplication sharedApplication].statusBarOrientation)) {
        viewCustormFrame.size.width = self.view.frame.size.width;
    }
    else {
        viewCustormFrame.size.width = self.view.frame.size.width;
    }
    
    [self.view addSubview:appDelegate.viewCustomTabBar];
    appDelegate.viewCustomTabBar.frame = viewCustormFrame;
    
    [srclViewMainContent addSubview:appDelegate.homeController.view];
    [srclViewMainContent addSubview:appDelegate.newsListController.view];
    [srclViewMainContent addSubview:appDelegate.columnController.view];
    [srclViewMainContent addSubview:appDelegate.whatsOnController.view];
    
    currentVisisbleController = appDelegate.homeController;
    
    [self resetAllSizes];
    [super viewDidLoad];
    

    }

В приведенном выше случае, хотя я получил, что все методы делегата ориентации вызываются в базовом VC, но не в другом Four VC.. поэтому мне пришлось настроить что-то вроде

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
     DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
    [appDelegate.homeController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    [appDelegate.newsListController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    [appDelegate.columnController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    [appDelegate.whatsOnController shouldAutorotateToInterfaceOrientation:interfaceOrientation];
    return (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationPortrait);
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;

    currentPageOffset = srclViewMainContent.contentOffset.x/srclViewMainContent.frame.size.width;
    [appDelegate.homeController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
    [appDelegate.newsListController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
    [appDelegate.columnController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
    [appDelegate.whatsOnController willRotateToInterfaceOrientation:toInterfaceOrientation duration:(NSTimeInterval)duration];
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

    DNAppDelegate *appDelegate = (DNAppDelegate*)[UIApplication sharedApplication].delegate;
    [self resetAllSizes];
    CGRect visibleRect = CGRectMake(currentPageOffset*srclViewMainContent.frame.size.width, 0, srclViewMainContent.frame.size.width, srclViewMainContent.frame.size.height);
    [srclViewMainContent scrollRectToVisible:visibleRect animated:NO];

    [appDelegate.homeController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [appDelegate.newsListController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [appDelegate.columnController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    [appDelegate.whatsOnController didRotateFromInterfaceOrientation:fromInterfaceOrientation];

}

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

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

Надеюсь, это даст вам некоторое представление. На всякий случай, если вы столкнетесь с каким-либо хорошим решением, опубликуйте его в качестве ответа и поделитесь со всеми нами.

person Rahul Sharma    schedule 11.05.2012
comment
Спасибо, Рахул Шарма... попробую. - person iOSDev; 11.05.2012