Виды сместились при повороте - PullRequest
0 голосов
/ 25 марта 2011

Я создал UIViewController (на основе Как переключать виды при вращении ), чтобы переключаться между 2 видами при вращении устройства.Каждое представление является «специализированным» для определенной ориентации.

. Оно использует уведомление UIDeviceOrientationDidChangeNotification для переключения представлений:

-(void) deviceDidRotate: (NSNotification *) aNotification{

    UIDeviceOrientation orientation = [[UIDevice currentDevice] orientation];

    NSLog(@"Device rotated to %d!", orientation);

    if ((orientation == UIDeviceOrientationPortrait) ||
        (orientation == UIDeviceOrientationPortraitUpsideDown)) {
        [self displayView:self.portraitViewController.view];
    }else if ((orientation == UIDeviceOrientationLandscapeLeft) ||
               (orientation == UIDeviceOrientationLandscapeRight)) {
        [self displayView:self.landscapeViewController.view];
    }

}

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

Портрет в первый раз : enter image description here

Повернуть вПейзаж : enter image description here

Назад к портрету : enter image description here

Если я повторю процесс поворота, все будет только хуже.Что я делаю не так?

Исходный код здесь: http://dl.dropbox.com/u/3978473/forums/Rotator.zip

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

Ответы [ 2 ]

1 голос
/ 25 марта 2011

Чтобы решить проблемы смещения, перепишите displayView: метод, как показано ниже.

- (void) displayView: (UIView *) aView { self.view = aView; }

Вращения, однако, странные. Вы должны просмотреть эту часть кода. Используйте методы вращения UIViewController

  • (аннулируются) willRotateToInterfaceOrientation: продолжительность:
  • (пустоты) didRotateFromInterfaceOrientation:

вместо - (void) deviceDidRotate:

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

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

0 голосов
/ 27 марта 2011

ОК, я нашел ошибку.Это довольно просто и глупо: я смешал рамку и границы.

В displayView: code я устанавливал рамку дочернего представления в рамку родительского представления, когда оно должно быть в границах родительского.

...