iPhone / iPad:如何以编程方式获取屏幕宽度?


83

嗨,我想知道是否有办法以编程方式获取宽度。

我正在寻找足以容纳iPhone 3GS,iPhone 4,iPad的通用产品。另外,宽度应根据设备是纵向还是横向(对于ipad)而改变。

有人知道该怎么做吗?我已经找了一段时间...谢谢!


屏幕的宽度,可用的应用程序空间的宽度(不带系统栏)还是您要查找的特定视图的宽度?
VdesmedT

嗯,我不确定。我想我只是想要设备的宽度(即在ipad 768中为纵向宽度而在1024中为横向宽度),但是self.view.bounds似乎满足了这一要求。请参阅下面的评论
Shai UI 2010年

请参阅此更全面的答案,其中考虑了设备的方向。
德鲁·斯蒂芬斯

@DrewStephens请参阅下面的答案,其中考虑了方向并且只有3行代码:D。
回忆录,

Answers:


204

看一下UIScreen

例如。

CGFloat width = [UIScreen mainScreen].bounds.size.width;

如果您不希望包含状态栏(不会影响宽度),请查看applicationFrame属性。

更新:事实证明,UIScreen(-bounds或-applicationFrame)没有考虑当前的界面方向。一种更正确的方法是询问您的UIView边界-假定此UIView已由其View控制器自动旋转。

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
    CGFloat width = CGRectGetWidth(self.view.bounds);
}

如果视图控制器未自动旋转视图,则需要检查界面方向,以确定视图边界的哪一部分代表“宽度”和“高度”。请注意,frame属性将为您提供UIWindow坐标空间中的视图区域(默认情况下),该区域将不考虑界面方向。


3
实际上,这在ipad面向横向时不起作用。即,如果我的模拟器正在横向运行,则它仍返回768(而不是1024)。您是否认为我应该有一个if语句来检查方向,或者是否有更好的获取宽度的方法?
Shai UI 2010年

该死的-看起来你是对的; 我已经用更多的想法更新了答案。
艾伦·罗杰斯

我最终只是使用“ CGFloat width = CGRectGetWidth(self.view.bounds);” 在我的方法中(不需要didRotateFromInterfaceOrientation)...因此,至少self.view.bounds考虑了方向。谢谢!!
Shai UI 2010年

5
对于其他可能偶然发现了该较旧文章的人,我发现self.view.bounds仅从didRotateFromInterfaceOrientation开始才是完全准确的。如果视图以其初始目标方向(如IB中指定的那样)显示,则在viewDidLoad和viewWillAppear中也将是准确的。如果视图以不同的方向显示,然后定向,则在didRotateFromInterfaceOrientation和view.bounds将不正确之前调用viewDidLoad(和viewWillAppear)
rimsky 2012年

在iOS 6的情况下,当我们使用Modal控制器时,didRotateFromInterfaceOrientation将不会被调用
Krishnan

12
CGRect screen = [[UIScreen mainScreen] bounds];
CGFloat width = CGRectGetWidth(screen);
//Bonus height.
CGFloat height = CGRectGetHeight(screen);

10
不考虑定向
里姆斯基-

6

这可以用3行代码完成

// grab the window frame and adjust it for orientation
UIView *rootView = [[[UIApplication sharedApplication] keyWindow] 
                                   rootViewController].view;
CGRect originalFrame = [[UIScreen mainScreen] bounds];
CGRect adjustedFrame = [rootView convertRect:originalFrame fromView:nil];

3
这很接近,但是如果正在显示UIAlertView,它将是键窗口,并且其rootViewController属性将为nil
matt bezark 2013年

@mattbezark正确。我认为那是一个极端的情况。有一种替代方法可以获取根视图-不如本视图那么干净,但是如果有人感兴趣,我将发布替代方法。
记忆

@memmons参加聚会有点晚了,但是我对您的替代解决方案很感兴趣:)
alexgophermix

0

从iOS 9.0开始,无法可靠地获得方向。这是我用于仅以纵向模式设计的应用程序所使用的代码,因此,如果以横向模式打开该应用程序,它将仍然准确:

screenHeight = [[UIScreen mainScreen] bounds].size.height;
screenWidth = [[UIScreen mainScreen] bounds].size.width;
if (screenWidth > screenHeight) {
    float tempHeight = screenWidth;
    screenWidth = screenHeight;
    screenHeight = tempHeight;
}


0

使用:

NSLog(@"%f",[[UIScreen mainScreen] bounds].size.width) ;

-2

这是一种获取屏幕尺寸的快捷方法,这也考虑了当前界面的方向:

var screenWidth: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.width
    } else {
        return UIScreen.mainScreen().bounds.size.height
    }
}
var screenHeight: CGFloat {
    if UIInterfaceOrientationIsPortrait(screenOrientation) {
        return UIScreen.mainScreen().bounds.size.height
    } else {
        return UIScreen.mainScreen().bounds.size.width
    }
}
var screenOrientation: UIInterfaceOrientation {
    return UIApplication.sharedApplication().statusBarOrientation
}

这些作为标准功能包括在:

https://github.com/goktugyil/EZSwiftExtensions

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.