iPhone / iPad:プログラムで画面幅を取得するにはどうすればよいですか?


83

こんにちは私はプログラムで幅を取得する方法があるかどうか疑問に思っています。

私はiphone3gs、iphone 4、ipadを収容するのに十分一般的なものを探しています。また、幅は、デバイスが縦向きか横向きか(ipadの場合)に基づいて変更する必要があります。

誰かがこれを行う方法を知っていますか?私はしばらく探していました...ありがとう!


画面の幅、使用可能なアプリケーションスペースの幅(システムバーなし)、または探している特定のビューの幅ですか?
vdesmedT 2010

うーん、よくわかりません。デバイスの幅(つまり、縦向きの幅にはipad 768、横向きの幅には1024)が必要だったと思いますが、self.view.boundsはこれを満たしているようです。以下の私のコメントを参照してください
foreyez 2010

デバイスの向きを考慮した、このより包括的な回答を参照してください。
ドリューステファンズ

@DrewStephensは、アカウントの向きにとり、その下私の答えを参照してくださいD:コードのわずか3行です。
memmons 2013年

回答:


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);
}

ビューがViewControllerによって自動回転されていない場合は、インターフェイスの向きを確認して、ビューの境界のどの部分が「幅」と「高さ」を表しているかを判断する必要があります。frameプロパティは、UIWindowの座標空間でビューの長方形を提供することに注意してください。これは(デフォルトでは)インターフェイスの向きを考慮していません。


3
実際、これはipadが横向きの場合は機能しません。つまり、シミュレーターが横向きで実行されている場合でも、(1024ではなく)768を返します。その場合、方向をチェックするifステートメントが必要だと思いますか、それとも幅を取得するためのより良い方法がありますか?
foreyez 2010

くそー-あなたが正しいように見えます。私はいくつかのアイデアで私の答えを更新しました。
アランロジャース

「CGFloatwidth = CGRectGetWidth(self.view.bounds);」を使用することになりました。私のメソッドでは(didRotateFromInterfaceOrientationは必要ありません)...少なくともself.view.boundsは方向を考慮に入れます。ありがとう!
foreyez 2010

5
この古い投稿に出くわしたかもしれない他の人にとって、self.view.boundsはdidRotateFromInterfaceOrientationから始めて完全に正確であることがわかりました。ビューが(IBで指定されているように)最初のターゲット方向で表示されている場合は、viewDidLoadとviewWillAppearでも正確になります。ビューがターゲットとは異なる方向で表示されている場合、didRotateFromInterfaceOrientationの前にviewDidLoad(およびviewWillAppear)が呼び出され、view.boundsが正しくありません
rimsky 2012年

iOS 6の場合、モーダルコントローラーを使用すると、didRotateFromInterfaceOrientationは呼び出されません
Krishnan

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

10
オリエンテーションを考慮していません
rimsky 2012年

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 2013

@memmonsはパーティーに少し遅れましたが、私はあなたの代替ソリューションに興味があります:)
alexgophermix 2015年

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

このコードを使用すると役立ちます

[[UIScreen mainScreen] bounds].size.height
[[UIScreen mainScreen] bounds].size.width

0

使用する:

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

-2

画面サイズを取得するSwiftの方法は次のとおりです。これには、現在のインターフェイスの向きも考慮されます。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.