Отключение автоматического поворота для одного UIView - PullRequest
6 голосов
/ 03 февраля 2010

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

У меня есть контроллер представления, который имеет несколько разных частей: фоновое представление, представление заголовка и несколько кнопок. Теперь я хочу, чтобы заголовок и кнопки работали автоматически (они делают, когда я возвращаю YES из shouldAutorotateToInterfaceOrientation :), но ни при каких обстоятельствах не должно вращаться фоновое представление. Есть ли правильный способ сделать это?

Ответы [ 4 ]

5 голосов
/ 16 июня 2011

Если вам не нужны временные повороты фонового вида, после которых фон меняется на правильную ориентацию, вам нужно отключить автоповорот для вида. Нет двух способов об этом.

Вам нужно будет самостоятельно управлять поворотом кнопок. Вы можете сделать хороший макет или надеть их, например, на Scrollview и просто изменить его размер.

В любом случае вам нужно добавить наблюдателя, чтобы вращать его самостоятельно,

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

И в didRotate вы делаете изменение размера, с хорошим анимированным переходом, если хотите.

- (void) didRotate:(NSNotification *)notification {
 int ori=1;
    UIDeviceOrientation currOri = [[UIDevice currentDevice] orientation];
    if ((currOri == UIDeviceOrientationLandscapeLeft) || (currOri == UIDeviceOrientationLandscapeRight)) ori=0;
}

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

2 голосов
/ 18 мая 2012

Существует «правильный» способ: разрешить фреймворку вращать интерфейс (иначе вы столкнетесь с проблемами при подключении другого контроллера представления), но переопределите анимацию вашего представления.

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

Затем в контроллере моего представления это изменение:

-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    [UIView animateWithDuration:duration
                     animations:^{
        if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
            _fixedView.transform = CGAffineTransformMakeRotation(M_PI_2);
        } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
            _fixedView.transform = CGAffineTransformMakeRotation(-M_PI_2);
        } else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
            _fixedView.transform = CGAffineTransformMakeRotation(M_PI);
        } else {
            _fixedView.transform = CGAffineTransformIdentity;
        }}];
}

Таким образом, все в _fixedView полностью исправлено (как это для описательных имен, а?) В то время как строка состояния и моя панель инструментов вращаются нормально.

2 голосов
/ 03 февраля 2010

Есть еще одна работа, о которой я думал ...

Вы можете использовать:

bgView.transform = CGAffineTransformMakeRotate(angle);

Вы должны рассчитать угол в соответствии с ориентацией (это может быть M_PI / 2, M_PI или 3 * M_PI / 2) ...

Вы можете использовать эту функцию внутри - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration, а также обернуть ее анимацией, которая будет анимироваться в течение той же продолжительности, что и анимация ориентации экрана:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
    // Decide what will be the angle...

    // Make the animation
    [UIView beginAnimations:@"orientationChange" context:nil];
    [UIView setAnimationDuration: duration];
    bgView.transform = CGAffineTransformMakeRotate(angle);
    [UIView commitAnimations];
}

Обратите внимание, что размер представления может быть изменен из-за верхней панели ...

Обратите внимание, что я сам никогда не пробовал ...

1 голос
/ 03 февраля 2010

Я не знаю о «правильном» способе, но обходной путь состоит в том, чтобы создать фоновое изображение в обеих ориентациях и просто изменить вид фона. Хороший вопрос, хотя - будет интересно посмотреть, что люди придумают в качестве решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...