获取iPad的当前定位?

时间:2010-04-29 15:49:32

标签: ipad orientation

在给定的事件处理程序(不是“shouldAutorotateToInterfaceOrientation”方法)中,如何检测当前的iPad方向?我有一个文本字段,我必须在横向视图中设置动画(键盘出现时),但不在纵向视图中,并且想知道我在哪个方向看动画是否必要。

11 个答案:

答案 0 :(得分:133)

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

[[UIDevice currentDevice] orientation]

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

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

有些人还想查看状态栏方向:

[UIApplication sharedApplication].statusBarOrientation

答案 1 :(得分:34)

我认为

[[UIDevice currentDevice] orientation];

不太可靠。有时候它有效,有时候不行......在我的应用程序中,我使用

[[UIApplication sharedApplication]statusBarOrientation]; 

它很棒!

答案 2 :(得分:9)

其中一个:

  • 检查活动视图控制器的interfaceOrientation属性。
  • [UIApplication sharedApplication].statusBarOrientation
  • [UIDevice currentDevice].orientation。 (您可能需要致电-beginGeneratingDeviceOrientationNotifications。)

答案 3 :(得分:8)

我找到了一个解决FaceUp方向问题的技巧!!!

延迟定向检查,直到应用程序开始运行,然后设置变量,视图大小等!!!

//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

-Chris Allinson

答案 4 :(得分:3)

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

1-使用以下方法:

**在-(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
    }
}

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

2-第二种方法是在-(void)viewDidLoad

中插入以下通知
[[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
    }
}

上述方法将检查ipad或iPhone状态栏的方向,并根据它以所需的方向制作动画。

答案 5 :(得分:2)

为了确定横向与纵向,有一个内置功能:

UIInterfaceOrientation orientation = [[UIDevice currentDevice] orientation];
BOOL inLandscape = UIDeviceOrientationIsLandscape(orientation);

答案 6 :(得分:1)

[UIApplication sharedApplication].statusBarOrientation会在风景照片时返回画像,并在发布时以人像拍摄风景,在iPad中

答案 7 :(得分:0)

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

因此,虽然我没有添加新的独立答案,但我会说使用上述内容并牢记这一点。注意:我收到状态栏方向,因为它是应用程序启动时唯一被调用的东西,并且“足够”以帮助我移动内容。

使用它的主要问题是视图被延迟加载。请务必调用所包含和子视图“之前”的视图属性,以便根据其方向设置其位置。感谢Apple在我们设置不存在的变量时没有崩溃,迫使我们记住他们打破OO并迫使我们这样做了......哇,这样一个优雅的系统却如此破碎!说真的,我喜欢Native,但它只是不好,鼓励糟糕的OO设计。不是我们的错,只是提醒您的调整大小功能可能正在运行,但Apple的方法要求您通过使用加载视图,而不是通过创建和初始化它

答案 8 :(得分:0)

在视图控制器中,获取self.interfaceOrientation的只读值(接口的当前方向)。

答案 9 :(得分:0)

我已经尝试了很多上述方法,但似乎没有任何东西对我有效。

我的解决方案是在根视图控制器中创建一个名为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-和didRotateFromInterfaceOrientation:消息,因此该值仍然不准确。

答案 10 :(得分:-1)

[UIDevice currentDevice].orientation效果很好。

BUT !!! ......诀窍是将其添加到 - (void)viewWillAppear:(BOOL)animated

EXP:

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

如果你在 - (void)viewDidLoad调用它,它就不可靠,特别是如果你使用多个线程(主UI线程,后台线程来访问大量外部数据,......)。


评论: 1)即使您的应用设置默认方向肖像,用户也可以将其锁定在横向。因此,设置默认值并不是解决它的真正解决方案。 2)还有其他任务,例如隐藏导航栏,放置在viewWillAppear上以使其工作并同时防止闪烁。同样适用于其他视图,例如UITableView willDisplayCell - >用它来设置cell.selected和cell.accessoryType。