Перевести UIAlertView в ландшафтный режим - PullRequest
0 голосов
/ 06 февраля 2012

Мне нужно отобразить UIAlertView в ландшафтном режиме.Я попробовал очевидное, установив преобразование в методе делегата willPresentAlertView: безрезультатно:

-(void) willPresentAlertView:(UIAlertView *)alertView {

    alertView.transform = CGAffineTransformMakeRotation(M_PI_2);
}

Есть предложения, как это исправить?

Ответы [ 5 ]

2 голосов
/ 06 февраля 2012

Вы пробовали в didPresentAlertView?

- (void)didPresentAlertView:(UIAlertView *)alertView
{
    // UIAlertView in landscape mode
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:0.1];
    alertView.transform = CGAffineTransformRotate(alertView.transform, 3.14159/2);
    [UIView commitAnimations];
}
1 голос
/ 19 октября 2016

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

-(void) willPresentAlertView:(UIAlertView *)alertView {

    [UIView setAnimationsEnabled:NO];

    self.view.window.windowLevel = 2003;

}

Поворот окна оповещения

-(void)didPresentAlertView:(UIAlertView *)alertView
{

    UIWindow * alertWindow = alertView.window;
    alertWindow.transform = CGAffineTransformMakeRotation(M_PI / 2);
    alertWindow.bounds = CGRectMake(0, 0, SCREEN_HEIGHT,SCREEN_WIDTH);
    alertWindow.center = CGPointMake(SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2);

    [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(showLandscapeAlertView) userInfo:nil repeats:NO];

}

После поворота окна оповещения переместите текущее окно назад.

-(void)showLandscapeAlertView {

    self.view.window.windowLevel = 0;

    [UIView setAnimationsEnabled:YES];

}
1 голос
/ 06 февраля 2012

Какова ориентация вида, в котором отображается предупреждение? У меня была та же проблема, я пытался показать UIAlertView в альбомной ориентации, но всегда появлялся в портретной ориентации. Итак, я принудительно ориентировал строку состояния:

[[UIApplication sharedApplication] setStatusBarOrientation:theOrientation];

Это сработало для меня.

1 голос
/ 06 февраля 2012

Он должен вращаться автоматически, если вы используете UIViewController.Вы забыли вернуть YES для желаемой ориентации в shouldAutorotateToInterfaceOrientation?

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES; /* auto rotate always */
}
0 голосов
/ 26 июля 2016

В последнее время я боролся с той же проблемой. Для меня решение было использовать UIAlertController - покрыть старую обработку UIAlertview и UIActionsheet.

  1. Создайте новый контроллер, выделенный из UIAlertController, где вы должны перегружать методы viewWillAppear и viewWillDisappear, как в примере ниже.

AlertViewController.h

#import <UIKit/UIKit.h>

@interface AlertViewController : UIAlertController 

@end

AlertViewController.m

#import "AlertViewController.h"

@interface AlertViewController ()

@end

@implementation AlertViewController

- (void) viewWillAppear:(BOOL)animated {
    [self.view setTransform:CGAffineTransformMakeRotation(M_PI_2)];
}

- (void) viewWillDisappear:(BOOL)animated {
    [self.view setHidden:YES];
}

...
  1. реализовать метод для отображения вида оповещения там, где вам нужно.

    • (void) showInfoAlertView {

          AlertViewController *alert = [AlertViewController alertControllerWithTitle:@"My Alert" message:@"This is an alert." preferredStyle:UIAlertControllerStyleAlert];
      
          UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
          [alert addAction:ok];
          [self presentViewController:alert animated:NO completion:nil];
      }
      
...