2015-02-13 1 views
2

Я пишу приложение для рисования, и я не хочу, чтобы вид чертежа вращался. В то же время я хочу, чтобы другие элементы управления хорошо вращались в зависимости от ориентации устройства. В прошивкой 7 я решил эту проблему с помощью:Отключить авторотирование в одном подзоне в iOS8

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 
    float rotation; 

    if (toInterfaceOrientation==UIInterfaceOrientationPortrait) { 
     rotation = 0; 
    } 
    else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeLeft) { 
     rotation = M_PI/2; 
    } else if (toInterfaceOrientation==UIInterfaceOrientationLandscapeRight) { 
     rotation = -M_PI/2; 
    } 

    self.drawingView.transform = CGAffineTransformMakeRotation(rotation); 
    self.drawingView.frame = self.view.frame; 
} 

Но прошивкой 8, даже если функция вызывается и преобразование установлен правильно, это не мешает взгляд от вращения.

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

Любые идеи?

Спасибо!

ответ

5

Хорошо после некоторых боевых действий с подвидов и transitionCoordinators я наконец понял это:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    CGAffineTransform targetRotation = [coordinator targetTransform]; 
    CGAffineTransform inverseRotation = CGAffineTransformInvert(targetRotation); 

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) { 

     self.drawingView.transform = CGAffineTransformConcat(self.drawingView.transform, inverseRotation); 

     self.drawingView.frame = self.view.bounds; 
    } completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { 
    }]; 
} 

Что я, я вычислить обратное преобразование, применяется к виду, а затем использовать его, чтобы изменить преобразования. кроме того, я меняю рамку на границы представлений. Это связано с тем, что он является полноэкранным.

+0

У меня была аналогичная проблема с сохранением некоторых элементов управления камерой прямо на iPad. Это сработало для меня с небольшим изменением: я установил drawView.frame равным прямоугольнику с начальным значением 0,0 и размером передаваемого «размера». – Walter

0

В преобразованиях iOS 8 не применяются к отдельным представлениям, принадлежащим контроллерам вида. Вместо этого преобразования поворота применяются к UIWindow. В результате разработчики никогда не видят применения вращения, а скорее изменяют размер.

В iOS 8 вы можете либо переопределить обратные вызовы для изменений класса размера, либо выполнить собственное преобразование там, либо вы можете получить ориентировочные события, как описано здесь: https://developer.apple.com/library/prerelease/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/motion_event_basics/motion_event_basics.html.

+0

Я попытался вращающимся с orientationDidChangeNotification и предотвращает вращение, но не изменение размеров и соответствующие неправильный монтаж. – Jan

+0

@ Dimitri это правильно. Если вы просто примените противоположное преобразование, оно будет неправильным. Вам нужно обрабатывать размер и позиционировать себя. – InkGolem

1

Ответ Димитрия отлично работал для меня. Это быстрая версия коды в случае, если кто-то нуждается в этом ...

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
    let targetRotation = coordinator.targetTransform() 
    let inverseRotation = CGAffineTransformInvert(targetRotation) 

    coordinator.animateAlongsideTransition({ context in 
    self.drawingView.transform = CGAffineTransformConcat(self.drawingView.transform, inverseRotation) 
    self.drawingView.frame = self.view.bounds 
    context.viewControllerForKey(UITransitionContextFromViewControllerKey) 
    }, completion: nil) 
}