Ручной метод поворота с боковым переключателем - PullRequest
0 голосов
/ 14 ноября 2011

В настоящее время я работаю над приложением для рисования для iPad.Мне нужно переместить и повернуть панель инструментов в приложении, когда она помещена в другую ориентацию, сохраняя область рисования в том же месте.

Я нашел метод здесь для этого,Он использует NSNotificationCenter для мониторинга изменений ротации.Это вызывает пользовательский метод didRotate:, который будет вращать и перемещать мою панель инструментов на основе UIDeviceOrientation.

Эта часть отлично работает.Однако всякий раз, когда боковой переключатель на iPad задействован для блокировки ориентации, панель инструментов перемещается в положение, в котором он находился при запуске.

Например: если я запускаю приложение в горизонтальной плоскости и поворачиваю его в портретную ориентациюпанель инструментов переместится в нижнюю часть экрана.Однако, как только я задействую ползунковый переключатель, он переместится в сторону экрана для горизонтальной ориентации влево.

Все методы, которые я использую для этого, приведены ниже.

- (void)viewDidLoad {
    [super viewDidLoad];


    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];
}

- (void)didRotate:(NSNotification *)notification {
    UIDeviceOrientation deviceOrientation = [[UIDevice currentDevice] orientation];

    UIInterfaceOrientation interfaceOrientation;

    bool orientationFound = YES;

    if (deviceOrientation == UIDeviceOrientationPortrait) {
        interfaceOrientation = UIInterfaceOrientationPortrait;
    } else if (deviceOrientation == UIDeviceOrientationPortraitUpsideDown) {
        interfaceOrientation = UIInterfaceOrientationPortraitUpsideDown;
    } else if (deviceOrientation == UIDeviceOrientationLandscapeLeft) {
        interfaceOrientation = UIInterfaceOrientationLandscapeRight;
    } else if (deviceOrientation == UIDeviceOrientationLandscapeRight) {
        interfaceOrientation = UIInterfaceOrientationLandscapeLeft;
    } else {
        orientationFound = NO;
    }



    if (orientationFound) {
        [self.toolbar changeToOrientation:interfaceOrientation withDuration:.25];
        [self.tutorialOverlay changeToOrientation:interfaceOrientation];
    }
}

- (void)changeToOrientation:(UIInterfaceOrientation)orientation withDuration:(float)duration {
    float angle;
    CGPoint origin;

    if (orientation == UIInterfaceOrientationPortrait) {
        angle = portraitAngle;
        origin = self.portraitOrigin;
    } else if (orientation == UIInterfaceOrientationPortraitUpsideDown) {
        angle = portraitUpsideDownAngle;
        origin = self.portraitUpsideDownOrigin;
    } else if (orientation == UIInterfaceOrientationLandscapeLeft) {
        angle = landscapeLeftAngle;
        origin = self.landscapeLeftOrigin;
    } else if (orientation == UIInterfaceOrientationLandscapeRight) {
        angle = landscapeRightAngle;
        origin = self.landscapeRightOrigin;
    }

    [UIView animateWithDuration:duration animations:^{
        self.transform = CGAffineTransformMakeRotation(angle);

        CGRect rect = self.frame;

        rect.origin = origin;

        self.frame = rect;
    }];
}

Ответы [ 2 ]

1 голос
/ 18 мая 2012

Я только что ответил на аналогичный вопрос здесь .По сути, просто позволяйте интерфейсу вращаться, но вращайте представление, которое вы не хотите вращать, «назад» в willRotateToInterfaceOrientation:duration:.

1 голос
/ 19 ноября 2011

Я бы настоятельно рекомендовал не использовать этот подход, основанный на уведомлениях. Обратите внимание, что имя уведомления UIDeviceOrientationDidChangeNotification; ориентация устройства не совпадает с ориентацией интерфейса, и это приводит к множеству небольших проблем, подобных этой. (Например, ориентация устройства включает UIDeviceOrientationFaceDown, который никогда не связан с ориентацией интерфейса.)

Я бы предложил позволить вашему контроллеру представления автоматически вращаться; это разместит панель инструментов и т. д. для вас. Затем вы можете переопределить - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration, чтобы область рисования вернулась в нужную вам ориентацию. (Вы использовали бы код, аналогичный приведенному выше методу changeToOrientation, но вместо этого для области рисования, и вам не нужно создавать собственный анимационный блок. Кроме того, все углы будут отрицаться, поскольку вы отменяете просмотр контроллера выполнен.)

...