Поворот изображения на 90 градусов в той же позиции при изменении ориентации - PullRequest
10 голосов
/ 19 июня 2011

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

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

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

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

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

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

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

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

self.btnFacebook.transform = CGAffineTransformMakeRotation(1.5707964);

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

EDIT

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

enter image description here

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

1 Ответ

21 голосов
/ 20 июня 2011

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

Я создал 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, которое я создал, чтобы проиллюстрировать это.

...