回答:
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;
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
[UIScreen scale]
。
CGRectGetWidth()
と誰かが指摘しました。画面の四角形に関しては問題になる可能性は低いと思いますが、気を付けるべき問題だと思います。CGRectGetHeight()
size
注意:[UIScreen mainScreen]にはステータスバーも含まれています。アプリケーションのフレーム(ステータスバーを除く)を取得する場合は、
+ (CGFloat) window_height {
return [UIScreen mainScreen].applicationFrame.size.height;
}
+ (CGFloat) window_width {
return [UIScreen mainScreen].applicationFrame.size.width;
}
return [[UIScreen mainScreen] bounds].size.width;
上記の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)")
return UIScreen.mainScreen().bounds].size.width
私は以前にこれらの便利な方法を使用しました:
- (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;
}
私はこれが古い投稿であることを理解していますが、次のような定数を#defineするのが便利な場合があるので、心配する必要はありません。
#define DEVICE_SIZE [[[[UIApplication sharedApplication] keyWindow] rootViewController].view convertRect:[[UIScreen mainScreen] bounds] fromView:nil].size
上記の定数は、デバイスの向きに関係なく正しいサイズを返す必要があります。次に、次元の取得は次のように簡単です。
lCurrentWidth = DEVICE_SIZE.width;
lCurrentHeight = DEVICE_SIZE.height;
それはあなたのデバイスのサイズを取得することは非常に、非常に簡単ですだけでなく、アカウントの向きにテイクを:
// 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];
UIAlertView
keyWindowのrootViewControllerビューとして自分自身を挿入します。アラートビューが表示されている場合、ユーザーはキーボードを操作できないため、通常、その時点でキーボードフレームを取得する必要がないため、コーナーケースを回避するロジックがあります。
デバイスの向きも考慮する必要があります。
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;
}
現代の答え:
アプリがiPadの分割ビューをサポートしている場合、この問題は少し複雑になります。画面ではなくウィンドウのサイズが必要です。これには2つのアプリが含まれる場合があります。実行中にウィンドウのサイズも異なる場合があります。
アプリのメインウィンドウのサイズを使用:
UIApplication.shared.delegate?.window??.bounds.size ?? .zero
注:上記のメソッドは、起動時にウィンドウがキーウィンドウになる前に誤った値を取得する場合があります。幅だけが必要な場合は、以下の方法をお勧めします:
UIApplication.shared.statusBarFrame.width
古いソリューションを使用UIScreen.main.bounds
すると、デバイスの境界が返されます。アプリが分割ビューモードで実行されている場合、サイズが正しくありません。
self.view.window
アプリに2つ以上のウィンドウが含まれていて、ウィンドウのサイズが小さい場合、最もホットな答えで間違ったサイズになることがあります。
これらを利用して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)
}
デバイスの向きに関係なく画面の幅/高さが必要な場合(縦向きのみのビューコントローラーのサイズを横向きから起動する場合に適しています):
CGFloat screenWidthInPoints = [UIScreen mainScreen].nativeBounds.size.width/[UIScreen mainScreen].nativeScale;
CGFloat screenHeightInPoints = [UIScreen mainScreen].nativeBounds.size.height/[UIScreen mainScreen].nativeScale;
[UIScreen mainScreen] .nativeBounds <-docsから->物理画面の境界の四角形。ピクセル単位で測定されます。この長方形は、ポートレイトアップの向きのデバイスに基づいています。この値は、デバイスが回転しても変化しません。
画面サイズを取得する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
}
これらは、以下の標準機能として含まれています。
CGFloat width = [[UIScreen mainScreen] bounds].size.width;
CGFloat height = [[UIScreen mainScreen]bounds ].size.height;
これらのマクロを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;