2012-02-06 95 views
0

我需要在横向模式下显示UIAlertView。我尝试了很明显,设置在willPresentAlertView:委托方法变换无济于事:强制UIAlertView进入横向模式

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

    alertView.transform = CGAffineTransformMakeRotation(M_PI_2); 
} 

关于如何解决此问题有什么建议?

回答

2

您是否在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]; 
} 
+0

这可能会在'willPresentAlertView'中工作,但我以前没有尝试过。 – 2012-02-06 13:13:52

+0

它可以在didPresentAlertView上工作:但它具有首先在错误位置显示视图的不良影响。 – cfischer 2012-02-06 13:26:31

+0

它在'willPresentAlertView'中工作吗?如果可以的话,那可能会消除动画效果。 – 2012-02-06 13:27:57

1

如果您使用的是UIViewController,它应该会自动旋转。 忘了在shouldAutorotateToInterfaceOrientation中忘记将所需的方向还原YES

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return YES; /* auto rotate always */ 
} 
+0

不,我返回YES,但它不自动旋转。 :-( – cfischer 2012-02-06 13:58:08

+1

它应该,如果它在控制器的层次结构中很深,它们都应该启用自动旋转,并且在窗口级别有两个或多个控制器可能会导致类似的问题 – djromero 2012-02-06 15:03:21

1

显示警报的视图的方向是什么?我遇到了同样的问题,我尝试在横向视图中显示UIAlertView,但始终以纵向显示。所以,我强制的状态栏的方向:

[[UIApplication sharedApplication] setStatusBarOrientation:theOrientation]; 

这对我有效。

0

最近我一直在努力解决相同的问题。对我而言,解决方案使用的是UIAlertController - 涵盖旧版本的UIAlertviewUIActionsheet

  1. 创建新的控制器,这是从UIAlertController,在那里你必须重载方法viewWillAppearviewWillDisappear,例如像在波纹管专用。

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]; 
} 

... 
  • 实现用于表示在你需要警报视图方法。警报窗口出现

    • (无效){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]; 
      } 
      
  • 1

    之前,设置在顶部的当前窗口显示。如果不这样做,您可以看到警报窗口的旋转动画。

    -(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]; 
    
    } 
    
    +0

    尽管此代码可能有助于解决这个问题并没有解释_why_和/或_how_它回答了这个问题,提供这个额外的上下文将显着提高它的长期教育价值,请编辑你的答案以增加解释,包括什么限制和假设适用。 – 2016-10-19 16:31:42

    +0

    作品像魅力! – SamuelChan 2017-06-23 08:06:45