Вращение изображения на 90 градусов в одном положении при изменении ориентации

Закончилось с этим: Самый простой способ поддержки нескольких ориентаций? Как загрузить пользовательский NIB, когда приложение находится в Landscape? Работает превосходно!

Я сделал изображение в Photoshop, которое я хочу использовать в качестве фона для своего информационного экрана в своем приложении для iPad. Изображение содержит текст и некоторые значки. Вокруг изображения у меня есть зеленая граница.

Эффект, который я пытаюсь достичь:

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

Я уже сделал следующее:

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

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:

и попытался сделать это:

self.btnFacebook.transform = CGAffineTransformMakeRotation(1.5707964);

который, я думаю, повернет свойство btnFacebook на 90 градусов вправо (исправьте меня, если я ошибаюсь), поскольку он указывает положительные радианы. Кажется, я не могу заставить его работать правильно. Должно ли это поворачивать кнопку на 90 градусов вокруг своей центральной координаты в кадре? Это не повлияет на изменение положения кнопки (кнопка квадратная)?

ИЗМЕНИТЬ

Сделано изображение:

enter image description here

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

Ответ 1

Я понимаю ваш вопрос как то, что вы пытаетесь не вращать интерфейс целиком, а поочередно поворачивать фиолетовый и красный квадраты.

Я создал UIViewController, который похож на ваш макет.

Interface Bulder screenshot

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

Есть 4 кнопки, которые подключены к btnx (x работает от 1 до 4).

Поскольку я больше не хочу автоматически поворачивать интерфейс, я поддерживаю только портретную ориентацию.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

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

- (void)deviceDidRotate:(NSNotification *)notification
{
    UIDeviceOrientation currentOrientation = [[UIDevice currentDevice] orientation];
    double rotation = 0;
    UIInterfaceOrientation statusBarOrientation;
    switch (currentOrientation) {
        case UIDeviceOrientationFaceDown:
        case UIDeviceOrientationFaceUp:
        case UIDeviceOrientationUnknown:
            return;
        case UIDeviceOrientationPortrait:
            rotation = 0;
            statusBarOrientation = UIInterfaceOrientationPortrait;
            break;
        case UIDeviceOrientationPortraitUpsideDown:   
            rotation = -M_PI;
            statusBarOrientation = UIInterfaceOrientationPortraitUpsideDown;
            break;     
        case UIDeviceOrientationLandscapeLeft:     
            rotation = M_PI_2;   
            statusBarOrientation = UIInterfaceOrientationLandscapeRight;
            break;  
        case UIDeviceOrientationLandscapeRight:    
            rotation = -M_PI_2;
            statusBarOrientation = UIInterfaceOrientationLandscapeLeft;
            break;
    }
    CGAffineTransform transform = CGAffineTransformMakeRotation(rotation);
    [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{
        [self.btn1 setTransform:transform];
        [self.btn2 setTransform:transform];
        [self.btn3 setTransform:transform];
        [self.btn4 setTransform:transform];
        [self.view1 setTransform:transform];
        [[UIApplication sharedApplication] setStatusBarOrientation:statusBarOrientation];
    } completion:nil];
}

Последнее, что нужно сделать, - заставить ОС вызывать мой метод. Для этого я добавил следующий код в application:didFinishLaunchingWithOptions: в AppDelegate.

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter] addObserver:self.viewController selector:@selector(deviceDidRotate:) name:UIDeviceOrientationDidChangeNotification object:nil];

Я не уверен, что это именно то, что вы хотели, но я считаю, что это по крайней мере похоже, чтобы вы могли получить от него какие-то идеи, как решить вашу проблему. Я могу предоставить исходный код для рабочего приложения iPad, которое я создал, чтобы проиллюстрировать это.