iOS에서 화면 너비와 높이를 얻는 방법은 무엇입니까?


506

iOS에서 화면의 크기를 어떻게 알 수 있습니까?

현재는 다음을 사용합니다.

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

에서 viewWillAppear:willAnimateRotationToInterfaceOrientation:duration:

처음으로 전체 화면 크기를 얻습니다. 두 번째로 화면에서 탐색 모음을 뺀 것입니다.

답변:


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;

스위프트 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
방향은 실제로 뷰 컨트롤러 수준에서 관리됩니다. View Controller의 인터페이스 방향 관리를 살펴보십시오 . 예, 뷰 컨트롤러의 interfaceOrientation 속성을 살펴보십시오. BTW, 당신은 화면 크기에 대해 물었습니다. 그래서 그것은 당신에게 보여주었습니다. 그러나 내용을 표시하려면 아마도 당신이하고있는 것에 따라 창 경계 또는 화면의 applicationFrame을 사용해야합니다.
Caleb

2
패딩하지 않고 전체 화면 너비를 반환한다는 점에 유의하는 것이 좋습니다. 간단하게 대부분의 요소에 대한 '사용 가능'공간을 얻을 이러한 결과에서 앱의 패딩 (각면에 보통 20) 빼기
닉 Daugherty

2
@NickDaugherty 네, 요점입니다. OP는 화면 크기를 원했습니다. 화면에 객체를 놓는 위치는 전적으로 본인에게 달려 있으며 구축하려는 앱 유형에 따라 다릅니다. 예를 들어 사진이나 게임 인터페이스를 표시하는 경우 패딩을 전혀 원하지 않을 수 있습니다.
Caleb

3
그러나 이것은 포인트 단위로 측정 된 값을 반환합니다. 따라서 화면 해상도를 픽셀 단위로 예상하면 결과가 올바르지 않으므로 결과에을 곱해야합니다 [UIScreen scale].
로봇 버그

3
누군가 CGRect가 음의 너비 또는 높이를 가질 수 있기 때문에 사각형 의 필드에 직접 액세스하는 대신 CGRectGetWidth()및 을 사용해야한다고 지적했습니다 . 나는 그것이 화면 사각형과 관련하여 문제가 될 것이라고 생각하지 않지만 그것이 알고 있어야한다고 생각합니다. CGRectGetHeight()size
Caleb

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

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"없이 컴파일 오류가 발생합니다.
stone

@skypecakes ".bounds"를 포함하도록 답변을 수정했습니다. 피드백을 주셔서 감사합니다.
Martin Woolstenhulme

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

좋은 해결책이지만 온도가 정의되지 않은 것으로 보입니다.
szemian

4
기본적으로 0,0을 얻습니까? fullScreenRect를 기록하면 {{8.03294e-35, 3.09816e-40}, {480, 320}}이 나옵니다. 나는 CGRect temp = CGRectZero;
szemian

1
UIInterfaceOrientationIsLandscape는 UIDevice에서 리턴 될 수있는 'UIDeviceOrientationFaceUp'및 'UIDeviceOrientationFaceDown'을 처리하지 않습니다.
Andriy

6
상태 표시 줄을 관리하는 screen.bounds 대신 screen.applicationFrame 속성을 사용하려고 할 수 있습니다.
Geraud.ch

경우에 따라 applicationFrame이 올바르게 빼면 상태 표시 줄이있는 프레임을 반환하지 않습니다 (분할 뷰에서 전체 화면 모달)
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

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

@LukeMcneice 내 프로덕션 코드에는 프레임이 있는지 확인하는 주장이 있습니다 ... 아직 주장하지 못했습니다. rootView 및 originalFrame에 무엇이 반환됩니까?
memmons

방향을 수정 한 너비 / 높이를 얻기 위해이 기술을 단일 톤으로 사용하고 있습니다. 그러나이 코드가 실행되는 동안 convertRect를 표시하는 UIAlert 창이 크기 (최소한 폭)가 0 인 adjustFrame을 반환하면 어떻게됩니까?
Electro-Bunny

아 는 UIAlertViewkeyWindow의 rootViewController보기로 자신을 삽입합니다. 경고보기가 작동하면 사용자가 키보드와 상호 작용할 수 없으므로 일반적으로 당시 키보드 프레임을 잡을 필요가 없기 때문에 코너 케이스를 피하는 논리가 있습니다.
memmons

통찰력에 감사드립니다. 배너 광고 싱글 톤에서 귀하의 기술을 사용하고있었습니다. 광고 API에 새 광고의 화면 프레임 크기를 알려주는 간단하고 좋은 방법이었습니다. 배너 광고와 UIAlert를 상호 배제 할 수 없으므로 필요에 따라 가로 / 세로 및 x / y 전환 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를 제시 할 때 임베디드 뷰 컨트롤러 내부에서 iPad 앱을 가로 방향으로 작동시키기 위해이 작업을 수행했습니다.
StackRunner


5

여기에 스위프트 3 업데이트되었습니다

iOS 9에서 사용되지 않는 applicationFrame

신속한 세에서 그들은 제거했다 () 그리고 그들은, 당신이 여기에서 참조 할 수 있습니다 몇 가지 이름 지정 규칙을 변경 한 링크

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 앱에 둘 이상의 창이 포함되어 있고 창이 작은 경우 가장 인기있는 답변의 크기가 잘못 될 수 있습니다.


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 <- 워드 프로세서 -> 픽셀 단위로 실제 화면의 경계 사각형. 이 사각형은 세로 방향의 장치를 기준으로합니다. 장치가 회전해도이 값은 변경되지 않습니다.


2

화면 크기를 얻는 신속한 방법은 다음과 같습니다.

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

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

-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.