2008-08-02 2 views
88

참고 :이 질문은 2008 년 이후이며 현재는 역사적인 관심사입니다.가로 모드의 iPhone 앱, 2008 시스템


처음부터 가로 모드로 실행되는 iPhone 응용 프로그램을 만드는 가장 좋은 방법은 장치의 위치에 관계없이 무엇입니까?

프로그래밍 방식으로 및 인터페이스 작성기를 사용하여. 애플 개발자 사이트에서

+5

미래의 독자를 위해 **이 유명한 문제 **가 2011 년 현재 Apple **에 의해 해결되었습니다. 아래의 답변에서 테스트 프로젝트에 유의하십시오. – Fattie

답변

46

역사적인 답변 만. 놀라운 구식 :

이 답변은 현재 상당히 오래되었습니다.

이 게시물은 에만 역사적인 호기심입니다.


흥미로운 뉴스! 앤드류 (Andrew)가 발견 한 바와 같이이 문제는 4.0+에서 Apple에 의해 수정되었습니다.

모든보기에서보기의 크기를 강제하는 것이 더 이상 필요하지 않으며 "처음 만 작동하는"풍경의 심각한 심각한 문제가 해결 된 것으로 보입니다.

2011 년 4 월 현재 4.0 이하는 테스트하거나 빌드 할 수 없으므로이 질문은 전적으로 역사적인 호기심입니다. 얼마나 많은 문제로 인해 개발자가 그렇게 오래 걸렸는지 놀라운 것입니다!


여기에 원래의 토론과 해결책이 있습니다. 이 시스템은 작동하지 않기 때문에 이것은 현재 전혀 관련이 없습니다.


이 작업을 완전히 수행하는 것은 극히 어려움 - 적어도 3 가지 문제/버그가 있습니다.

이 시도 .. 특히 interface builder landscape design

참고가 을 말한다 "당신은 어디에서나 제대로 shouldAutorotateToInterfaceOrientation을 사용할 필요"가, 사방의 모든 전체 화면보기를 의미 곳.

희망이 악몽에 도움이 되길 바랍니다!

손을 여기에서 추가 잘 알려진 문제의 중요한 알림 : 한보기 (모든 풍경), 보다 더 사이에 교환하려는 경우 단순히을 작동하지 않습니다. 이것을 기억하는 것이 중요합니다. 그렇지 않으면 문제가 발생한 날을 낭비하게됩니다. 그것은 문자 그대로 가능하지 않습니다. 그것은 iOS 플랫폼에서 가장 큰 공개 된 알려진 버그입니다. 문자 그대로 하드웨어가 두 번째보기를로드 할 수있는 방법이 없습니다. 짜증나지만 간단한 해결 방법, 그리고 당신이해야 할 일은 아무것도하지 않고 거기에 앉아서 자신의 견해를 바꿀 수있는 사소한 마스터 UIViewController입니다. 아이폰 OS에 있기 때문에 주요 알고 버그 즉

:

[window addSubview:happyThing.view]; 
[window makeKeyAndVisible]; 

당신은 한 번만을 할 수 있습니다. 나중에 happyThing.view를 제거하려고 시도하고 대신 newThing.view를 넣으면 IT가 작동하지 않으며 그 것입니다.컴퓨터는보기를 가로 방향으로 회전시키지 않습니다. 아무 트릭 픽스도 없으며, 심지어 애플은 그것을 작동시킬 수 없다. 당신이 채택해야하는 해결 방법은 거기에 앉아서 다양한 뷰 (happyThing, newThing 등)를 보유하는 전체적인 UIViewController를 갖는 것입니다. 희망이 도움이됩니다!

+2

4.x에서 수정되었습니다. 우리는 여러 화면, 풍경 및 일부 초상화가있는 게임을 출하했으며 3.x에서는 작동하지 않았습니다. 그것을 처리하기 위해 여분의 더미 뷰에 들어가기를 원하지 않고 대신에 4.x가 필요합니다.이 질문 이후 1 년은 아마도 괜찮습니다. – AndrewS

+0

우리는 "항상 풍경"이 아니라 다양한 풍경이나 초상화를 사용했습니다. 각 VC는 창에 직접 추가되거나 창에서 제거됩니다. 앱이 화면을 시작하여 여러 화면 전환을 통해 그 상태를 유지합니다. 더미 뷰는 사용하지 않지만 모든 화면에서 shouldAutorotate를 재정의합니다. 터치 패드에서 폰으로의 4.x에는 아무런 문제가 없습니다. – AndrewS

40

:

상태 표시 줄 바로 적절한 위치에 있도록, 풍경 모드에서 응용 프로그램을 시작 UIInterfaceOrientation 키를 추가 당신의 Info.plist 파일을 편집하려면 적절한 값 (UIInterfaceOrientationLandscapeRight 또는 UIInterfaceOrientationLandscapeLeft) 으로 목록에 나타낸 바와 같이 2

,745,

목록 2 : 가로 모드에서 응용 프로그램 시작

<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeRight</string> 
+5

당신의 shouldAutorotateToInterfaceOrientation 메소드에서이 더하기는 return (interfaceOrientation! = UIInterfaceOrientationPortrait); 너 끝났어. – mbehan

+5

질문은 가로 모드에서 장치를 시작하는 방법을 묻습니다. 대답은 그 정보를 제공합니다. 그 후 오리엔테이션을 다루는 것은 질문에서 언급되지 않았다. +1 Michael Pryor –

+1

흥미롭게도 "답변"은 실제로 가로 모드에서 장치를 시작하지 않습니다. - !! 그것은 아마도 모든 Apple 환경에서 가장 유명한 버그/어려움 일 것입니다. 그것은 매우 일하는 iPad 개발자를위한 기본입니다! – Fattie

6

sasb 년대와 michaelpryor의 대답은 올바른 것으로 보인다,하지만 당신을 위해 작동하지 않는 경우,이 대안 시도 :

- (void)applicationDidFinishLaunchingUIApplication *)application { 
    application.statusBarOrientation = UIInterfaceOrientationLandscapeRight; 
} 

또는 이 하나 :

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight]; 

또는이 하나 :

[application setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO]; 

먼저 window makeKeyAndVisible;으로 전화해야 할 수도 있습니다.

몇 가지 링크

: Developing in landscape mode, iPhone SDK: How to force Landscape mode only?

@Robert : The iPhone SDK, NDA, and Stack Overflow를 참조하십시오.

4

최신 iPhone OS 프로그래밍 가이드에는 샘플 코드가 포함되어 있습니다. 나는 이것이 최근 추가 된 것이라고 확신합니다. 아마도 당신이 그것을 놓쳤을 것입니다. 당신이 준수해야하는 모든 조건을 설명합니다; 기본적으로 ...

  • 가의 Info.plist 속성 당신의 UIViewController의 viewDidLoad 중 하나에 (이 상태 표시 줄의 위치를 ​​변경,하지만보기가)
  • 가 중심을 수동으로 뷰를 회전 설정 : 방법 또는 당신의 아래 applicationDidFinishLaunching : 방법이나 구현 자동 회전 ("자동 크기 행동", 124 페이지) "가로 모드에서 시작"에 대한

봐, 102 페이지

7

먼저 나는 정보에서 설정합니다.PLIST

<key>UIInterfaceOrientation</key> 
<string>UIInterfaceOrientationLandscapeRight</string> 

는 내가 아래 applicationDidFinishLaunching에서이 코드를 넣어 :

CGAffineTransform rotate = CGAffineTransformMakeRotation(1.57079633); 
[window setTransform:rotate]; 

CGRect contentRect = CGRectMake(0, 0, 480, 320); 
window.bounds = contentRect; 
[window setCenter:CGPointMake(160.0f, 240.0f)]; 

내가 가로 모드에서 인터페이스 빌더에서 뷰에서 작업 할 수 있습니다이 방법.

27

모든 게시물의 요약 및 통합, 직접 테스트 한 후; 아래의 4.x, 5.x에 대한 업데이트를 확인하십시오.

3.2부터는 실행중인 응용 프로그램의 방향을 코드에서 변경할 수 없습니다.

그러나 고정 된 방향으로 애플리케이션을 시작할 수는 있지만 그렇게하는 것은 쉽지 않습니다.

이 레시피 시도 :
  1. 는 480x320을 "기본 뷰 컨트롤러"를 정의하여 창에서 Info.plist 파일
  2. UISupportedInterfaceOrientations로 방향을 설정합니다. 다른 모든보기는 해당보기의 하위보기로 추가됩니다. shouldAutorotateToInterfaceOrientation: 방법을 설정하는 모든 뷰 컨트롤러에서
  3. self.view.frame = CGRectMake(0, 0, 480, 320)

    에서와 배경보기 설정된 모든 뷰 컨트롤러에서

  4. (물론, 당신이 PLIST에 정의 된 동일한 값을 반환) viewDidLoad 방법.

업데이트 (아이폰 OS 4.x의 경우, 5.x를) : 애플 iOS 앱 프로그래밍 가이드는 "고급 앱 트릭"장에서 "가로 모드에서 시작"단락을 가지고있다.

참고 :

+1

이것이 진정한 의미의 유일한 해결책이라는 것을 확인할 수 있습니다. 이것을 찾아서 평가하는 데 몇 시간이 걸렸습니다. 다른 모든 대답은 문제의 부분적인 해결책 일뿐입니다. –

+0

나는 SO 질문에 대한 링크가이 질문으로 어떻게 연결되는지를 좋아합니다. –

+0

Ty Richard, 루핑 링크 제거됨 – IlDan

5

나는 아직 아무도이 대답을 마련하지 않았다 놀랐어요하십시오 모달을 기각 할 때 내 모든 테스트에서

보기 컨트롤러 부모보기 컨트롤러의 기본 설정 방향 shouldAutorotateToInterfaceOrientation에 설정된 경우에도 UINavi의 일부 gationController. 그래서 이것에 대한 해결책은 간단합니다 :

배경에 대한 UIImageView로 더미 UIViewController를 만듭니다. 시작할 때 앱이 사용하는 default.png 이미지로 이미지를 설정합니다.

viewWillAppear이 루트보기 컨트롤러에서 호출되면 애니메이션없이 더미보기 컨트롤러를 표시하기 만하면됩니다.

더미보기 컨트롤러에서 viewDidAppear이 호출되면 멋진 교차 디졸브 애니메이션으로보기 컨트롤러를 닫습니다.

이 방법이 효과가있을뿐만 아니라 효과적입니다.BTW, 단지 설명을 위해 내가 루트 뷰 컨트롤러의 viewWillAppear과 같이 수행

- (void)viewWillAppear:(BOOL)animated 
{ 
if (dummy != nil) { 
    [dummy setModalTransitionStyle:UIModalTransitionStyleCrossDissolve]; 
    [self presentModalViewController:dummy animated:NO]; 
    [dummy release]; 
    dummy = nil; 
} 
... 
} 
3

이 대답을 참조하십시오 : 모든 파일에 YES = Landscape Mode ONLY for iPhone or iPad

  1. shouldAutorotateToInterfaceOrientation을 PLIST하는 방향을 추가를

혼합 모드를 사용하는 경우 더 편리 할 수도 있지만

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];