iOSで画面の幅と高さを取得する方法は?


506

iOSで画面のサイズを取得するにはどうすればよいですか?

現在、私は使用します:

lCurrentWidth = self.view.frame.size.width;
lCurrentHeight = self.view.frame.size.height;

viewWillAppear:willAnimateRotationToInterfaceOrientation:duration:

初めて画面全体のサイズを取得します。2回目は、画面からナビゲーションバーを引いたものです。

回答:


1063

iOSで画面のサイズを取得するにはどうすればよいですか?

投稿したコードの問題は、画面のサイズに合わせてビューのサイズを数えていることです。これまで見てきたように、常にそうであるとは限りません。画面サイズが必要な場合は、次のように画面自体を表すオブジェクトを確認する必要があります。

CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
CGFloat screenHeight = screenRect.size.height;

分割ビューの更新:コメントで、Dmitryが尋ねました:

分割ビューで画面のサイズを取得するにはどうすればよいですか?

上記のコードは、分割画面モードでも画面のサイズを報告します。分割画面モードを使用すると、アプリのウィンドウが変わります。上記のコードで期待する情報が得られない場合は、OPと同様に、間違ったオブジェクトを調べています。ただし、この場合は、次のように画面ではなくウィンドウを確認する必要があります。

CGRect windowRect = self.view.window.frame;
CGFloat windowWidth = windowRect.size.width;
CGFloat windowHeight = windowRect.size.height;

Swift 4.2

let screenRect = UIScreen.main.bounds
let screenWidth = screenRect.size.width
let screenHeight = screenRect.size.height

// split screen            
let windowRect = self.view.window?.frame
let windowWidth = windowRect?.size.width
let windowHeight = windowRect?.size.height

7
向きは、実際にはビューコントローラレベルで管理されます。見てみましょうビューコントローラのインターフェイスの向きを管理します。ですから、ビューコントローラのinterfaceOrientationプロパティを確認してください。ところで、あなたは画面サイズについて尋ねたので、それを示しましたが、コンテンツを表示するには、何をしているのかに応じて、ウィンドウの境界または画面のapplicationFrameを使用する必要があります。
カレブ

2
これにより、パディングなしで画面全体の幅が返されることに注意してください。これらの結果からアプリのパディング(通常は両側に20)を引くだけで、ほとんどの要素に「使用可能な」スペースが得られます
Nick Daugherty

2
@NickDaughertyはい、それがポイントです-OPは画面の寸法を望んでいました。画面上でオブジェクトを配置する場所は完全にあなた次第であり、構築するアプリのタイプによって異なります。たとえば、写真やゲームのインターフェースを表示している場合、パディングはまったく必要ないかもしれません。
カレブ

3
ただし、これはポイントで測定された値を返すことに注意してください。したがって、ピクセル単位の画面解像度を想定している場合、結果は正しくないため、結果にを掛ける必要があります[UIScreen scale]
Robotbugs 2013

3
CGRectは負の幅または高さを持つ可能性があるため、長方形のフィールドに直接アクセスする代わりに、を使用する必要があるCGRectGetWidth()と誰かが指摘しました。画面の四角形に関しては問題になる可能性は低いと思いますが、気を付けるべき問題だと思います。CGRectGetHeight()size
カレブ2014

64

注意:[UIScreen mainScreen]にはステータスバーも含まれています。アプリケーションのフレーム(ステータスバーを除く)を取得する場合は、

+ (CGFloat) window_height   {
    return [UIScreen mainScreen].applicationFrame.size.height;
}

+ (CGFloat) window_width   {
    return [UIScreen mainScreen].applicationFrame.size.width;
}

4
iOS 9.0で非推奨
Zakaria Darwish

6
applicationFrameは非推奨であるため、次のものに置き換えてくださいreturn [[UIScreen mainScreen] bounds].size.width;
lizzy81 '25 / 04/25

44

上記のObjective-Cの回答の一部をSwiftコードに翻訳しました。各翻訳は、元の回答を参照して進められます。

主な回答

let screen = UIScreen.main.bounds
let screenWidth = screen.size.width
let screenHeight = screen.size.height

単純な関数の答え

func windowHeight() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.mainScreen().applicationFrame.size.width
}

デバイスの向きの答え

var screenHeight : CGFloat
let statusBarOrientation = UIApplication.sharedApplication().statusBarOrientation
// it is important to do this after presentModalViewController:animated:
if (statusBarOrientation != UIInterfaceOrientation.Portrait
    && statusBarOrientation != UIInterfaceOrientation.PortraitUpsideDown){
    screenHeight = UIScreen.mainScreen().applicationFrame.size.width
} else {
    screenHeight = UIScreen.mainScreen().applicationFrame.size.height
}

ログの回答

let screenWidth = UIScreen.mainScreen().bounds.size.width
let screenHeight = UIScreen.mainScreen().bounds.size.height
println("width: \(screenWidth)")
println("height: \(screenHeight)")

ログの回答にタイプミスがあるようです:UIScreen.mainScreen()。bounds.size.width?「.bounds」なしでコンパイルエラーが発生します。

@skypecakes「.bounds」を含めるように答えを修正しました。フィードバックをお寄せいただきありがとうございます。
Martin Woolstenhulme、2015

applicationFrameはiOS 9以降で非推奨になりました。代わりにreturn UIScreen.mainScreen().bounds].size.width
Suhaib

39

私は以前にこれらの便利な方法を使用しました:

- (CGRect)getScreenFrameForCurrentOrientation {
    return [self getScreenFrameForOrientation:[UIApplication sharedApplication].statusBarOrientation];
}

- (CGRect)getScreenFrameForOrientation:(UIInterfaceOrientation)orientation {

    CGRect fullScreenRect = [[UIScreen mainScreen] bounds];

    // implicitly in Portrait orientation.
    if (UIInterfaceOrientationIsLandscape(orientation)) {
      CGRect temp = CGRectZero;
      temp.size.width = fullScreenRect.size.height;
      temp.size.height = fullScreenRect.size.width;
      fullScreenRect = temp;
    }

    if (![[UIApplication sharedApplication] statusBarHidden]) {
      CGFloat statusBarHeight = 20; // Needs a better solution, FYI statusBarFrame reports wrong in some cases..
      fullScreenRect.size.height -= statusBarHeight;
    }

    return fullScreenRect;
} 

素晴らしい解決策ですが、tempの起源が未定義であるように見えることに注意してください。
セーミアン2012

4
デフォルトとして0,0を取得しますか?fullScreenRectにログインすると、{{8.03294e-35、3.09816e-40}、{480、320}}が得られました。CGRect temp = CGRectZeroで初期化することを選択しました。
セーミアン2012

1
UIInterfaceOrientationIsLandscapeは、UIDeviceから返される可能性のある「UIDeviceOrientationFaceUp」と「UIDeviceOrientationFaceDown」を処理しません。
Andriy

6
ステータスバーを処理するscreen.boundsではなく、screen.applicationFrameプロパティを使用することもできます。
Geraud.ch 2012年

場合によっては、applicationFrameが正しく減算されたステータスバー(splitviewからのフルスクリーンモーダル)でフレームを返さないことが判明
Luke Mcneice

15

私はこれが古い投稿であることを理解していますが、次のような定数を#defineするのが便利な場合があるので、心配する必要はありません。

#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size

上記の定数は、デバイスの向きに関係なく正しいサイズを返す必要があります。次に、次元の取得は次のように簡単です。

lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;

マクロはAnswerBotの回答に基づいて作成することをお勧めします。
griotspeak 2013

13

それはあなたのデバイスのサイズを取得することは非常に、非常に簡単ですだけでなく、アカウントの向きにテイクを:

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

こんにちは、iPadランドスケープのみのアプリのviewDidLoadでこれを使用しています。最初に正しい値が取得され、その後すべてのロードで値が「反転」する理由があります。ナビゲートしてビューに戻ると、向きを変更していなくても、ポートレートとして読み取っているようです。ありがとう
craigk 2013

@LukeMcneice私のプロダクションコードでは、フレームが検出されたことを確認するためのアサートがあります...そのアサートはまだ失敗していません。rootViewとoriginalFrameに対して何が返されますか?
memmons 2013

この手法をシングルトンで使用して、向きが修正された幅/高さを取得しています。ただし、convertRectを表示するUIAlertウィンドウがサイズ(少なくとも幅)が0のAdjustedFrameを返している間にこのコードが実行される場合、何が起こっているのでしょうか?
Electro-Bunny

ああ。UIAlertViewkeyWindowのrootViewControllerビューとして自分自身を挿入します。アラートビューが表示されている場合、ユーザーはキーボードを操作できないため、通常、その時点でキーボードフレームを取得する必要がないため、コーナーケースを回避するロジックがあります。
memmons 2013

洞察をありがとう。私はバナー広告シングルトンであなたのテクニックを使っていました。これは、新しい広告の画面フレームのサイズを広告APIに通知するシンプルで優れた方法でした。バナー広告とUIAlertを相互に除外することはできないため、必要に応じて横向きと縦向きの検出と総当たりの切り替えx / yにフォールバックする可能性があります。
Electro-Bunny

9

デバイスの向きも考慮する必要があります。

CGFloat screenHeight;
// it is important to do this after presentModalViewController:animated:
if ([[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortrait || [[UIApplication sharedApplication] statusBarOrientation] == UIDeviceOrientationPortraitUpsideDown){
    screenHeight = [UIScreen mainScreen].applicationFrame.size.height;
}
else{
    screenHeight = [UIScreen mainScreen].applicationFrame.size.width;
}

モーダルVCを表示するときに、埋め込まれたView Controller内からiPadアプリをランドスケープで動作させるためにこれを行いました。
StackRunner 2014年


5

ここで私は迅速に3を更新しました

iOS 9から廃止されたapplicationFrame

迅速な3では、それらは削除されている()、彼らは、あなたがここで参照することができますいくつかの命名規則を変更したリンク

func windowHeight() -> CGFloat {
    return UIScreen.main.bounds.size.height
}

func windowWidth() -> CGFloat {
    return UIScreen.main.bounds.size.width
}

4

現代の答え:

アプリがiPadの分割ビューをサポートしている場合、この問題は少し複雑になります。画面ではなくウィンドウのサイズが必要です。これには2つのアプリが含まれる場合があります。実行中にウィンドウのサイズも異なる場合があります。

アプリのメインウィンドウのサイズを使用:

UIApplication.shared.delegate?.window??.bounds.size ?? .zero

注:上記のメソッドは、起動時にウィンドウがキーウィンドウになる前に誤った値を取得する場合があります。幅だけが必要な場合は、以下の方法をお勧めします:

UIApplication.shared.statusBarFrame.width

古いソリューションを使用UIScreen.main.boundsすると、デバイスの境界が返されます。アプリが分割ビューモードで実行されている場合、サイズが正しくありません。

self.view.window アプリに2つ以上のウィンドウが含まれていて、ウィンドウのサイズが小さい場合、最もホットな答えで間違ったサイズになることがあります。


4

これらを利用してStructs、Swift 3.0の現在のデバイスに関する有用な情報を知る

struct ScreenSize { // Answer to OP's question

    static let SCREEN_WIDTH         = UIScreen.main.bounds.size.width
    static let SCREEN_HEIGHT        = UIScreen.main.bounds.size.height
    static let SCREEN_MAX_LENGTH    = max(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)
    static let SCREEN_MIN_LENGTH    = min(ScreenSize.SCREEN_WIDTH, ScreenSize.SCREEN_HEIGHT)

}

struct DeviceType { //Use this to check what is the device kind you're working with

    static let IS_IPHONE_4_OR_LESS  = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH < 568.0
    static let IS_IPHONE_SE         = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 568.0
    static let IS_IPHONE_7          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 667.0
    static let IS_IPHONE_7PLUS      = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 736.0
    static let IS_IPHONE_X          = UIDevice.current.userInterfaceIdiom == .phone && ScreenSize.SCREEN_MAX_LENGTH == 812.0
    static let IS_IPAD              = UIDevice.current.userInterfaceIdiom == .pad && ScreenSize.SCREEN_MAX_LENGTH == 1024.0

}


struct iOSVersion { //Get current device's iOS version

    static let SYS_VERSION_FLOAT  = (UIDevice.current.systemVersion as NSString).floatValue
    static let iOS7               = (iOSVersion.SYS_VERSION_FLOAT >= 7.0 && iOSVersion.SYS_VERSION_FLOAT < 8.0)
    static let iOS8               = (iOSVersion.SYS_VERSION_FLOAT >= 8.0 && iOSVersion.SYS_VERSION_FLOAT < 9.0)
    static let iOS9               = (iOSVersion.SYS_VERSION_FLOAT >= 9.0 && iOSVersion.SYS_VERSION_FLOAT < 10.0)
    static let iOS10              = (iOSVersion.SYS_VERSION_FLOAT >= 10.0 && iOSVersion.SYS_VERSION_FLOAT < 11.0)
    static let iOS11              = (iOSVersion.SYS_VERSION_FLOAT >= 11.0 && iOSVersion.SYS_VERSION_FLOAT < 12.0)
    static let iOS12              = (iOSVersion.SYS_VERSION_FLOAT >= 12.0 && iOSVersion.SYS_VERSION_FLOAT < 13.0)

}

3

デバイスの向きに関係なく画面の幅/高さが必要な場合(縦向きのみのビューコントローラーのサイズを横向きから起動する場合に適しています):

CGFloat screenWidthInPoints = [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale;
CGFloat screenHeightInPoints = [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale;

[UIScreen mainScreen] .nativeBounds <-docsから->物理画面の境界の四角形。ピクセル単位で測定されます。この長方形は、ポートレイトアップの向きのデバイスに基づいています。この値は、デバイスが回転しても変化しません。


2

画面サイズを取得するSwiftの方法を次に示します。

print(screenWidth)
print(screenHeight)

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



1

Swift 3.0

幅用

UIScreen.main.bounds.size.width

高さ

UIScreen.main.bounds.size.height

-2

これらのマクロをpchファイルに配置し、「SCREEN_WIDTH」を使用してプロジェクトの任意の場所で使用できます

#define SCREEN_WIDTH                ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height)

および「SCREEN_HEIGHT」

#define SCREEN_HEIGHT               ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) || ([UIApplication sharedApplication].statusBarOrientation ==   UIInterfaceOrientationPortraitUpsideDown)) ? [[UIScreen mainScreen] bounds].size.height : [[UIScreen mainScreen] bounds].size.width)

使用例:

CGSize calCulateSizze ;
calCulateSizze.width = SCREEN_WIDTH/2-8;
calCulateSizze.height = SCREEN_WIDTH/2-8;

マークダウン形式に従ってコードをインデントできますか?現在、これはレビューキュー内のコミュニティユーザーによって「低品質」としてフラグが付けられています。
Manoj Kumar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.