Управление ориентацией на iPhone 3, iPhone 4 и iPad - PullRequest
1 голос
/ 27 июня 2010

У меня есть представление с tableView и mapView. В портретном режиме я хочу, чтобы mapView занимал верхние 60% экрана, а представление таблицы - нижние 40%. В альбомной ориентации я хочу, чтобы mapView занимал 45% экрана справа, а tableView - 55% слева.

Таким образом, я подумал, что нечто подобное должно сработать:

    -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
    {
     UIScreen* mainscr = [UIScreen mainScreen];
     CGSize screenSize = mainscr.currentMode.size;

 if(self.interfaceOrientation == UIInterfaceOrientationLandscapeLeft 
    || self.interfaceOrientation == UIInterfaceOrientationLandscapeRight)
 {
  tableview.frame = CGRectMake(0, 0 , (screenSize.height*.55), screenSize.width);
  mapView.frame = CGRectMake((screenSize.height*.55), 0, (screenSize.height*.45), screenSize.width);
 }
 else 
 {
  tableview.frame = CGRectMake(0, (screenSize.height*.6) ,screenSize.width, (screenSize.height*.4));
  mapView.frame = CGRectMake(0, 0,screenSize.width, (screenSize.height*.6));
 }

    }

Этот код отлично работает на симуляторе iphone с версией 4 ОС, но когда я пытаюсь запустить его на симуляторе iphone 4 или на симуляторе ipad, изображения полностью отключаются (я могу видеть только около четверти карта в портретной и нет таблицы, а в альбомной я могу видеть только таблицу).

Я не понимаю, почему это так - поскольку я просто масштабирую представления, чтобы соответствовать размеру экрана, разве что-то вроде приведенного выше кода не будет работать нормально, независимо от разрешения устройства? Мне удалось исправить ситуацию путем масштабирования с использованием различных значений для iphone, iphone 4 и ipad, но использованные мною числа были обнаружены методом проб и ошибок, и, похоже, они не имеют особого смысла.

Может кто-нибудь указать мне правильный способ передачи этих изменений ориентации для всех устройств? Большое спасибо!

1 Ответ

3 голосов
/ 27 июня 2010

Я сделал что-то похожее на это. Вот как я бы выполнил то, что вы хотели бы сделать

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    CGSize screenSize = self.view.bounds.size;

    [UIView beginAnimations:@"InterfaceRotations" context:nil];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:duration];

    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
        tableview.frame = CGRectMake(0, 0 , (screenSize.height*.55), screenSize.width);
        mapView.frame = CGRectMake((screenSize.height*.55), 0, (screenSize.height*.45), screenSize.width);
    } else {
        tableview.frame = CGRectMake(0, (screenSize.height*.6) ,screenSize.width, (screenSize.height*.4));
        mapView.frame = CGRectMake(0, 0,screenSize.width, (screenSize.height*.6));
    }

    [UIView commitAnimations];
}
...