【问题标题】:Forcing UIAlertView into landscape mode强制 UIAlertView 进入横向模式
【发布时间】:2012-02-06 12:47:58
【问题描述】:

我需要在横向模式下显示 UIAlertView。我尝试了显而易见的方法,将 willPresentAlertView: 委托方法中的转换设置为无济于事:

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

    alertView.transform = CGAffineTransformMakeRotation(M_PI_2);
}

关于如何解决此问题的任何建议?

【问题讨论】:

    标签: objective-c cocoa-touch uialertview cgaffinetransform


    【解决方案1】:

    你试过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];
    }
    

    【讨论】:

    • 这可能适用于willPresentAlertView,但我之前没有尝试过。
    • 它确实可以在 didPresentAlertView: 上工作,但是它会首先在错误的位置显示视图。
    • 它在willPresentAlertView 中有效吗?如果是这样,那可能会删除动画效果。
    • 我认为这可能是willPresentAlertView 的错误,似乎默认恢复为纵向。可以在没有动画的情况下尝试此代码,alertView.transform = CGAffineTransformRotate(alertView.transform, 3.14159/2);didPresentAlertView
    • 用内置常量 M_PI_2 替换 3.14159/2 让它看起来更好一点。
    【解决方案2】:

    如果您使用UIViewController,它应该会自动旋转。 您是否忘记在shouldAutorotateToInterfaceOrientation 中返回YES 以获得所需的方向?

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

    【讨论】:

    • 不,我返回是,但它不会自动旋转。 :-(
    • 应该的。如果它在控制器的层次结构中很深,那么它们都应该启用自动旋转。此外,在窗口级别拥有 2 个或更多控制器可能会导致此类问题。
    【解决方案3】:

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

    [[UIApplication sharedApplication] setStatusBarOrientation:theOrientation];
    

    这对我有用。

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 虽然这段代码可能有助于解决问题,但它并没有解释为什么和/或如何回答问题。提供这种额外的背景将显着提高其长期教育价值。请edit您的答案添加解释,包括适用的限制和假设。
      【解决方案5】:

      我最近一直在为同样的问题而苦苦挣扎。对我来说,解决方案是使用 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];
      }
      
      ...
      
      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];
          }
          

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-13
        • 1970-01-01
        • 1970-01-01
        • 2016-09-12
        • 1970-01-01
        • 2014-03-04
        相关资源
        最近更新 更多