본문 바로가기

Program/iOS

UIDeviceOrientation

1. 방향 상태 얻기

UIDeviceOrientation * orientation = [UIApplication sharedApplication].statusBarOrientation;
if ( UIDeviceOrientationIsPortrait(orientation) ) {
...
}
else if( UIDeviceOrientationIsLandscape(orientation) ) {
...
}
else if( orientation==UIDeviceOrientationUnknown) {
...
}

[[UIDevice currentDevice] orientation] : 아이폰이 누웠을때 UIDeviceOrientationUnknown 를 호출하기 때문에 쓰기 힘들다.

[UIDevice currentDevice] beginGenerationgDeviceOrientationNotifications];
프로그램 시작시 호출해야 시작할때부터 로테이션 상태를 얻을 수 있다.
그래도 안되면.. 나올때까지 계속 재귀적으로 호출해준다. 그러면 나온다..
while(orientation!=UIDeviceOrientationUnknown) {
  orientation= [[UIDevice currentDevice] orientation]);
}
이런식으로 해줘도 될거 같긴 한데.. 너무.. 메모리 많이 잡아먹을듯..
performSelector로 afterDelay 조금 조절해가면서 하자.. 물론 나는 0초로.. 하지만서도..


2. 방향 상태 설정하기

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientation];

@interface UIDevice (MyPrivateNameThatAppleWouldNeverUseGoesHere) // Warning 뜨니깐 추가해주자
 - (void) setOrientation:(UIInterfaceOrientation)orientation;
 @end 

 
[상태바 방향 설정]

[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientation animated:YES];

[시작시 로테이션 줄때]
*.plist 에서 Key값 Initial Interface orientation 에서 Value 수정(SDK 4.0이후로 plist가 바뀐듯 싶음..)

참고 : http://www.dejoware.com/blogpages/files/iphone_programming_landscape_view_tutorial.html 


3. 로테이션 못받아오는 상황

(1) UINavigationController, UITabbarController 가 상위에 있는 경우
이런 경우는 하위의 ViewController에서 암만 shouldAutorotateToInterfaceOrientation에서 리턴값을 YES로 줘도 안돌아간다.

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation

그냥 상위 뷰컨트롤러(네비게이션컨트롤러, 탭바컨트롤러)를 서브클래싱해서 위의 함수를 오버라이딩시킨다.

참고 : http://developer.apple.com/library/ios/#qa/qa2010/qa1688.html

[하위뷰컨트롤러, 뷰에서 이벤트를 받기]
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
[[NSNotificationCenter defaultCenter] postNotificationName:@"NOTIFICATION_ROTATE" object:nil];
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated]; 
 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(rotate) name::@"NOTIFICATION_ROTATE" object:nil];
}

- (void) viewWillDisappear:(BOOL)animated {
 [[NSNotificationCenter defaultCenter] removeObserver:self name::@"NOTIFICATION_ROTATE" object:nil];
}


(2) 기타 상황
이런 경우 못받아옴.. 크윽.. 멋대로 릴리즈하지 맙시다

VC* vc= [[VC alloc] init];
 [vc.view setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
 [window addSubview:vc.view];
 //[vc release];

'Program > iOS' 카테고리의 다른 글

Xcode Archive Version Unspecified  (4) 2011.07.13
UIWebView User-Agent  (1) 2011.07.11
Xcode4 svn login timeout  (0) 2011.05.12
AES-128/256 Encryption & Decryption  (1) 2011.04.18
Mac - Parallels 한영전환  (1) 2010.12.24