web-dev-qa-db-ja.com

IOSで画面の幅と高さを取得する方法

どうやってiOSの画面の大きさを知ることができますか?

現在、私は使用します:

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

viewWillAppear:willAnimateRotationToInterfaceOrientation:duration:

初めて画面全体のサイズを取得します。二度目私は画面マイナスナビゲーションバーを取得します。

487
griotspeak

どうやって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;

スイフト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
1033
Caleb

注意してください、[UIScreen mainScreen]にはステータスバーも含まれています。アプリケーションのフレームを取得する場合は(ステータスバーを除く)、使用する必要があります。

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

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

上記の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)")
42

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

- (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;
} 
39
Luke Mcneice

これは古い投稿であることを私は認識していますが、時々私はそれを心配する必要はないのでこれらのような定数を#defineするのが役に立つと思います:

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

上記の定数は、デバイスの向きに関係なく正しいサイズを返します。それから次元を得ることは同じくらい簡単です:

lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;
15
A Random User

それはあなたのデバイスサイズを取得するのは非常に、非常に簡単です 同様に オリエンテーションを考慮に入れてください:

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

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

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;
}
9
Oleh Kudinov
NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%.0f", [[UIScreen mainScreen] bounds].size.height);
8
Gaurav Gilani

ここで私は Swift 3 について更新しました

applicationFrame iOS 9から非推奨

Swift 3では、これらは削除され()、命名規則がほとんど変更されていません。ここで参照することができます リンク

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

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

Swift 3.0の現在のデバイスに関する有用な情報を知るためにこれらのStructsを利用してください

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
Badhan Ganesh

デバイスの向きに関係なく画面の幅/高さが必要な場合(縦向きのView Controllerのみを横向きから起動する場合に適しています):

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

[UIScreen mainScreen] .nativeBounds < - ドキュメントから - >物理スクリーンの境界矩形(ピクセル単位)。この長方形は、縦向きのデバイスに基づいています。この値はデバイスが回転しても変わりません。

3
John Erck

これは、画面サイズを取得するための迅速な方法です。

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

2
Esqarrouth

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

1

スイフト3.0

幅のため

UIScreen.main.bounds.size.width

高さのため

UIScreen.main.bounds.size.height
1
Amul4608

現代の答え:

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

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

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

注:上記の方法は、起動時にwindowがキーウィンドウになる前に誤った値になる可能性があります。あなたが幅だけを必要とするならば、以下の方法は非常に 推奨されます

UIApplication.shared.statusBarFrame.width

UIScreen.main.boundsを使った古い解決法はデバイスの境界を返します。アプリが分割表示モードで実行されていると、間違ったサイズになります。

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

1
leavez