代码之家  ›  专栏  ›  技术社区  ›  MikeN

了解iPad的当前方向?

  •  62
  • MikeN  · 技术社区  · 14 年前

    11 回复  |  直到 14 年前
        1
  •  133
  •   Paul Lynch    14 年前

    方向信息不是很一致,有几种方法。如果在视图控制器中,可以使用 interfaceOrientation 财产。从其他地方您可以拨打:

    [[UIDevice currentDevice] orientation]
    

    或者,您可以请求接收方向更改通知:

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

    有些人还喜欢检查状态栏的方向:

    [UIApplication sharedApplication].statusBarOrientation
    
        2
  •  35
  •   TheTiger    12 年前

    我想

    [[UIDevice currentDevice] orientation];
    

    不是很可靠。有时行得通,有时不行。。。在我的应用程序中,我使用

    [[UIApplication sharedApplication]statusBarOrientation]; 
    

        3
  •  9
  •   kennytm    14 年前

    • 检查 interfaceOrientation
    • [UIApplication sharedApplication].statusBarOrientation .
    • [UIDevice currentDevice].orientation -beginGeneratingDeviceOrientationNotifications .)
        4
  •  8
  •   Chris Allinson    13 年前

    我找到了一个解决面朝上定向问题的窍门!!!

    //CODE
    
    - (void)viewDidLoad {
    
      [super viewDidLoad];
    
      //DELAY
      [NSTimer scheduledTimerWithTimeInterval:0.5 
                         target:self 
                         selector:@selector(delayedCheck) 
                         userInfo:nil 
                         repeats:NO];
    
    }
    
    
    -(void)delayedCheck{
    
      //DETERMINE ORIENTATION
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait ){
          FACING = @"PU";
      }
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown ){
          FACING = @"PD";
      }
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeLeft ){
          FACING = @"LL";
      }
      if( [UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationLandscapeRight ){
          FACING = @"LR";
      } 
      //DETERMINE ORIENTATION
    
      //START
      [self setStuff];
      //START
    
    }
    
    
    -(void)setStuff{
    
      if( FACING == @"PU" ){
              //logic for Portrait
      }
      else
      if( FACING == @"PD" ){
              //logic for PortraitUpsideDown
      }
      else{ 
      if( FACING == @"LL"){
              //logic for LandscapeLeft
      }
      else
      if( FACING == @"LR" ){
              //logic for LandscapeRight
      }
    
    }
    
    //CODE
    

    您可以在“setStuff”函数中添加子视图、位置元素等。。。任何最初取决于方向的东西!!!

    :D个

        5
  •  3
  •   Ahmed Hammad    12 年前

    您可以通过两种方式实现这一点:

    **把下面的一行放在 -(void)viewDidLoad 方法:

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil];
    

    然后把这个方法放到你的类中

    -(void)deviceRotated:(NSNotification*)notification
    {
    
       UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
        if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
        {
            //Do your textField animation here
        }
    }
    

    上述方法将检查设备旋转时的方向

    第二种方法是在内部插入以下通知

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(checkRotation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil];
    

    然后将以下方法放入类中

    -(void)checkRotation:(NSNotification*)notification
    {
        UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
        if(orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight)
        {
             //Do your textField animation here
        }
    }
    

        6
  •  2
  •   caleb    12 年前

    对于确定横向与纵向,有一个内置函数:

    UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
    BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);
    
        7
  •  1
  •   j0k user1957683    11 年前

    [UIApplication sharedApplication].statusBarOrientation

        8
  •  0
  •   Stephen J    12 年前

    我不知道为什么,但每次我的应用程序启动,前4个是正确的,但随后我得到相反的方向。我使用一个静态变量来计算,然后用BOOL来翻转我如何手动将其发送到子视图。

    使用它的主要问题是视图被延迟加载。一定要调用包含视图和子视图的视图属性,然后根据它们的方向设置它们的位置。感谢苹果在我们设置不存在的变量时没有崩溃,迫使我们记住它们破坏了OO,也迫使我们这么做。。。嘎,这么优雅的系统却如此破碎!说真的,我喜欢原生的,但它不好,鼓励糟糕的OO设计。不是我们的错,只是提醒你的调整大小功能可能正在工作,但苹果的方式要求你通过使用加载视图,而不是通过创建和初始化它

        9
  •  0
  •   Marco Valentin Shamardin    12 年前

        10
  •  0
  •   avance    11 年前

    我的解决方案是在根视图控制器中生成一个名为orientation of type UIInterfaceOrientation的iVar。

    - (void)viewDidLoad {
    
        [super viewDidLoad];
        orientation = self.interfaceOrientation; // this is accurate in iOS 6 at this point but not iOS 5; iOS 5 always returns portrait on app launch through viewDidLoad and viewWillAppear no matter which technique you use.
    }
    
    
    - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{
        return YES;
    }
    
    -(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    
        orientation =  toInterfaceOrientation;
    
    }
    

    然后,在任何需要检查方向的地方,都可以这样做:

     if(UIInterfaceOrientationIsPortrait(orientation)){
        // portrait
      }else{
       // landscape
      }
    

    也许还有更好的方法,但这似乎在98%的时间里都能奏效(尽管有iOS5),而且并不太难。请注意,iOS5总是在纵向视图中启动iPad,然后向设备发送willRotateTo和didrotatefromminterfaceorientation:messages,因此该值在短期内仍然不准确。

        11
  •  -1
  •   Michael Biermann TobiasOetzel    12 年前

    [UIDevice currentDevice].orientation 效果很好。

    ... 诀窍是把它加到- (void)viewWillAppear:(BOOL)animated

    实验:

    (void)viewWillAppear:(BOOL)animated{
       ...
       BOOL isLandscape = UIInterfaceOrientationIsLandscape(self.interfaceOrientation);
       ...
    }
    

    (void)viewDidLoad ,它工作不可靠,特别是如果使用多个线程(主UI线程、后台线程访问大量外部数据…)。


    1) 即使您的应用程序设置了默认的方向肖像,用户也可以将其锁定在横向。因此,设置默认值并不是解决问题的真正方法。 2) 还有其他任务,如隐藏导航栏,将被放置在视图将出现,使它工作,同时防止闪烁。这同样适用于UITableView等其他视图 willDisplayCell -&燃气轮机;使用它设置cell.selected和cell.accessoryType。