2010-04-16 1 views
1

Я разрабатываю приложение для iPad, которое представляет собой в основном большой холст с несколькими кнопками сбоку. (Не звучит очень оригинально, не так ли?: P)iPhone OS: вращайте только изображения кнопок, а не виды

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

Тем не менее, я хочу, чтобы изображения на кнопках вращались (например, в приложении для iPhone-камеры), когда устройство повернуто. UIPopoverControllers также должны использовать текущую ориентацию пользователей (и не отображаться сбоку).

Каков наилучший способ достичь этого?

(я полагал, что мог поворачивать холст на место с AffineTransform, но я не думаю, что это идеальный вариант.)

Спасибо заранее!

ответ

0

Я нашел способ сделать это, подобно тому, что предложил Дейв ДеЛонг.

Использование сработавшего преобразования, но оно не было идеальным. Хотя конечный результат (конец анимации) был тем, что я хотел, он остался бы показ какой-то шаткой анимации вращения.

Тогда я нашел это:

https://developer.apple.com/iphone/library/qa/qa2010/qa1688.html

Что говорит о том, что второй (или третий и т.д.) UIViewController добавлены в окно не будет получать события вращения, и, следовательно, никогда не будет вращаться. И это сработало!

Я создал «поддельный» UIViewController с пустым представлением и добавил это как первый контроллер представления. Это получает события поворота, которые затем передаются другим контроллерам представлений, которые затем могут выбирать, нужно ли вращать - весь вид или только ярлыки кнопок.

Немного взломанный ... Но я думаю, что пользователь не заметит.

0

Просто извергая от идеи (не уверен, если это будет работать или нет) ...

Может быть, вы могли бы ваш экран управляется UIViewController, который поддерживает все направления, но полотно управляться одним, что поддерживает только одну ориентацию (т. е. возвращает NO в своем методе shouldAutorotate...).

Если это не сработает, я бы, скорее всего, пошел с аффинным маршрутом.

+0

Насколько мне известно, вложение UIViewControllers не позволит «нижнему» 'UIViewController' получать методы авторотации.Я бы, вероятно, пошел с «affineTransform». – bddckr

+0

@ChriB приятно знать! Как я уже сказал, я не был уверен, что это сработает или нет. :) –

0

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

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; 

    //The following if statement determines if it is an iPad, if it is then the interface orientation is allowed. This line can be taken out to support both iPhones an iPads. 
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { 
     //Swap images and use animations to make the swap look "smooth" 
     //NSLog(@"Landscape Right"); 

    } else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) { 
     //Swap images and use animations to make the swap look "smooth" 
     //NSLog(@"Landscape Left"); 

    } else { 
     //Swap images and use animations to make the swap look "smooth" 
     //NSLog(@"Portrait"); 
    } 
} else { 

} 
} 

Чтобы изменить изображение в интерфейсе программно:

[myUIImageView setImage:[UIImage imageNamed:@"myImage.png"]]; 

Кроме того, в убедитесь, что представление не автоматически вращается, используя метод shouldAutorotateToInterfaceOrientation, чтобы сообщить вашему приложению, чтобы он оставался в портрете.

Смежные вопросы