如何将视图初始化为界面方向?

Posted

技术标签:

【中文标题】如何将视图初始化为界面方向?【英文标题】:How do I initialize a view to an interface orientation? 【发布时间】:2010-08-13 05:40:21 【问题描述】:

问题是我正在启动应用内电子邮件并触发键盘(通过 UITextFields),它们在我的横向应用程序中出现了纵向显示。我可以将其纵向旋转,然后再次横向旋转,观察应用程序从纵向旋转到横向时出现的黑色旋转角动画。由于我在 shouldAutorotateToInterfaceOrientation() 方法中锁定了除横向之外的任何方向,因此视图本身不会旋转,这很好。但是,当我添加这些视图时,应用程序一直认为它们是纵向的,正如 UITextField 键盘和应用内电子邮件方向所证明的那样,除非我旋转到纵向,然后再回到横向(这会触发 autorotate 方法返回 true。

关于如何让这个应用在我添加视图时知道它已经是横向的,有什么建议吗?

更新:我曾尝试设置状态栏方向,但它对我不起作用。我不知道我删除然后向应用程序添加视图是否会混淆它对方向的理解。您知道诸如 UITextField 和应用内邮件之类的苹果对象如何确定要显示的方向吗?他们只是轮询 sharedApplication 方向吗?对我来说奇怪的是,当我删除并添加新视图时,我倾斜手机以更改为横向的这些苹果小部件似乎突然恢复为纵向显示。即这个事件的一般顺序:

1) 横向应用,触发键盘,显示纵向

2) 倾斜装置使其进入横向。关闭和打开键盘,它是横向的。

3) 删除并添加一些视图。

4) 再次触发键盘,竖屏显示

【问题讨论】:

【参考方案1】:

[UIApplication setStatusBarOrientation:animated:] 应该给你你想要的。

【讨论】:

【参考方案2】:

在项目 plist 中设置 Initial interface orientation 字段

【讨论】:

【参考方案3】:

有趣的是,我发现在启动时设置状态栏方向是不够的。观察字段值,我注意到它在不同时间重置为纵向,例如从取消应用内邮件返回时。我发现多次调用设置状态栏似乎可以解决问题。感谢您的意见,mbehan。

【讨论】:

【参考方案4】:

删除/添加视图不应改变状态栏方向;据我所知,除非您明确设置它,否则默认为视图控制器的方向(然后您必须小心,因为视图控制器会重置它)。您可以尝试使用 UIStatusBarStyleBlackTranslucent 并在您的 VC 上设置 UIViewController.wantsFullScreenLayout 以查看发生了什么。

(过去,当我在仅纵向视图之上直接向窗口添加视图时,我注意到它会感到困惑。不过,它似乎在所有其他情况下都有效......)

你对 shouldAutorotateToInterfaceOrientation: 的实现是什么?

【讨论】:

【参考方案5】:

试试这个:

-(void)viewWillAppear:(BOOL)animated

    [super viewWillAppear:animated];

//Rotate the complete view to look like landscape view
    [self rotateToLandscape];

以及旋转方式;

-(void)rotateToLandscape

    UIWindow *win = [[UIApplication sharedApplication]keyWindow];
if(UIInterfaceOrientationIsPortrait(self.interfaceOrientation))
    [[[UIApplication sharedApplication] keyWindow] setBackgroundColor:[UIColor blackColor]];
    [UIView beginAnimations:@"View Flip" context:nil];
    [UIView setAnimationDuration:0.3];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    win.transform = CGAffineTransformIdentity;
    win.transform = CGAffineTransformMakeRotation(degreesToRadian(90));
    win.bounds = CGRectMake(0.0f, 0.0f, 480, 320);
    win.center = CGPointMake(160.0f, 240.0f);
    [UIView commitAnimations];
   

【讨论】:

以上是关于如何将视图初始化为界面方向?的主要内容,如果未能解决你的问题,请参考以下文章

使用 IBOutlets 将视图控制器初始化为自定义视图

呈现的视图控制器如何从当前方向(尤其是横向)初始化?

iOS 5 中的 iPad 方向问题

c语言 如何将已赋值的字符串初始化为空?

如何创建一个同时支持横向和纵向但不在它们之间旋转的视图控制器(保持其初始方向)

如何将 Kotlin 的 MutableList 初始化为空 MutableList?