iPhone / IPad : 프로그래밍 방식으로 화면 너비를 얻는 방법은 무엇입니까?


83

안녕하세요 프로그래밍 방식으로 너비를 얻는 방법이 있는지 궁금합니다.

나는 iphone 3gs, iphone 4, ipad를 수용하기에 충분히 일반적인 것을 찾고 있습니다. 또한 기기가 세로인지 가로인지에 따라 너비가 변경되어야합니다 (ipad의 경우).

아무도 이것을하는 방법을 알고 있습니까 ?? 오랜만에 찾고 있었는데 ... 고마워!


화면의 너비, 사용 가능한 응용 프로그램 공간의 너비 (시스템 표시 줄 제외) 또는 찾고있는 특정보기의 너비입니까?
VdesmedT

hrmm 잘 모르겠습니다. 나는 장치의 너비를 원했지만 (즉, 세로 너비의 경우 ipad 768, 가로 너비의 경우 1024) self.view.bounds가 이것을 만족하는 것 같았습니다. 아래에있는 내 의견을 참조
foreyez

장치의 방향을 고려한 보다 포괄적 인 답변 을 참조하십시오 .
Drew Stephens

@DrewStephens 방향을 고려 하고 단 3 줄의 코드 인 아래 내 대답을 참조하십시오 : D.
memmons

답변:


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

뷰가 뷰 컨트롤러에 의해 자동 회전되지 않는 경우 인터페이스 방향을 확인하여 뷰 경계의 어느 부분이 '너비'와 '높이'를 나타내는 지 결정해야합니다. frame 속성은 기본적으로 인터페이스 방향을 고려하지 않는 UIWindow의 좌표 공간에서 뷰의 사각형을 제공합니다.


3
실제로, 이것은 ipad가 가로 방향 일 때 작동하지 않습니다. 즉, 시뮬레이터가 가로 모드를 실행하는 경우 여전히 768 (1024 대신)을 반환합니다. 이 경우 방향을 확인하는 if 문이 있어야한다고 생각합니까? 아니면 너비를 얻는 더 좋은 방법이 있습니까?
foreyez

젠장, 당신이 옳은 것 같습니다. 나는 더 많은 아이디어로 내 대답을 업데이트했습니다.
Alan Rogers

결국 "CGFloat width = CGRectGetWidth (self.view.bounds);"를 사용했습니다. 내 방법에서 (didRotateFromInterfaceOrientation이 필요 없음) ... 그래서 적어도 self.view.bounds는 방향을 고려합니다. 감사!!
foreyez

5
이 오래된 게시물을 우연히 발견 한 다른 사람들을 위해 self.view.bounds는 didRotateFromInterfaceOrientation에서 시작하는 것만으로 완전히 정확하다는 것을 알았습니다. 뷰가 IB에 지정된대로 초기 대상 방향으로 표시되는 경우 viewDidLoad 및 viewWillAppear에서도 정확합니다. 뷰가 다른 방향으로 표시되고 대상이 지정되면 didRotateFromInterfaceOrientation 전에 viewDidLoad (및 viewWillAppear)가 호출되고 view.bounds가 올바르지 않습니다
rimsky

iOS 6의 경우, 그리고 우리가 모달 컨트롤러를 사용할 때, didRotateFromInterfaceOrientation은 호출되지 않습니다
Krishnan

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

10
오리엔테이션을 고려하지 않음
rimsky

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

@memmons 늦게 나는 대체 솔루션 :)에 관심이있을 거라고하지만 파티에 조금
alexgophermix

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


-2

다음은 화면 크기를 가져 오는 신속한 방법이며 현재 인터페이스 방향도 고려합니다.

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.