원래 앱 개발시, 개발자 레퍼런스나 기타 강좌들을 통해 이런 말을 보게 될 것이다.
"아이폰엔 하나의 윈도우(UIWindow) 만 존재 할 수 있다."

뭐 정확하진 않아도 대강 저런 어조였는데 저건 앱스토어 "앱" 이야기 이고
트윅에선 임의로 여러가지의 윈도우를 띄울 수 있다. 

최근에 내가 만들었던 앱다이얼러라던가.. SBSettings 의 설정 화면 등이 UIWindow 를 더 띄운 예이고
추가로 Activator 의 제스쳐 감지도 보이지 않는 최상위 윈도우를 Activator 에서 만들어서 감지한다.


만드는 법은 간단하다.
아! 그리고 일단 UIWindow 는 UIView 의 하위객체란건 알아두자..ㅋㅋ

UIWindow* aWindow = [[UIWindow alloc] initWithFrame:CGRect];
aWindow.windowLevel = 1500;

aWindow.hidden = FALSE;


그냥 저렇게 하면 나타난다...ㅋㅋㅋ
[aWindow makeKeyAndVisible]; 등으로도 나타나게 할 순 있지만 keyWindow 로 만들 것이 아니니까
그냥 hidden값만 바꿔주면 된다. (keyWindow 는 아이폰이든 맥이든 하나만 존재 가능.. 이라곤 하던데 예전에 makeKey 를 남발해도 크게 문제는 없더라.. 단지 자잘한 오류를 경험했기에 비추....)

크기를 전체화면이 아니게 할 경우 윈도우 이 외 부분은 원래 그대로 터치가 되니 윈도우를 하나 더 만들어서 막거나, 애초에 전체화면으로 만들거나 등등 알아서 머리 잘 쓰자..

숨기기와 관련해서.. hidden =TRUE; 가 아니라 alpha 를 0으로 줘서 숨길 경우 잠금화면->홈 화면 으로 갈때 등 특정 상황에서 숨겨뒀던 윈도우 잔상이 나타나는 버그가 있으니 참고. 


여기서 끝내긴 아쉬우니, 내가 좀 삽질했던 회전 관련 팁..
View 도 아니고, 애플이 제공하는 틀 안도 아니기에 화면 회전 관련이 좀 불편하다..

기기 방향을 알기 위해서 [[UIApplication sharedApplication] statusBarOrientation] 를 호출 하면 된다.

주석 달아놨으니 참고하자.



반환값은 int 인데
1: 세로  2: 180도 회전  3: 반시계 방향 90도  4: 시계방향 90도
로 기억한다... (3,4 가 바뀔 수 있으니 구분하는게 중요하다면 확인해 볼것. 단지 화면 돌리기만 할 것이라면 밑에 알아서 되어 있으니 신경 안써도 된다.)

그러고 나서 값에 맞게 WIndow 를 돌려줘야 한다. 

1,2,3,4 가 각각 어떤 방위인지는 5줄 위에 적어둔 걸로 기억한다. 주석따윈 귀찮으니 알아서 보자..



윈도우는 이렇게 돌려주면 되는데..........................
이게 X 같은게 돌리고 나면 Window 하위로 붙이는 뷰는 회전된 윈도우의 해당 방위에 맞게 알아서 잘 되는데 문제는 Window 자신의 좌표가 좀 꼬인다.. 

화면을 돌리더라도, 기기 내부 앱이든 뭐든이 회전하더라도 좌표의 기준점, 즉 (0,0) 의 위치가 변하지 않는다! 게다가 x축 y축 방향도 변하지 않는다!!
즉, 90도를 돌린 경우에 사용자가 보는 세로가 그대로 x축이고 가로는 y축.....
좀 다르게 말하자면,, 방위에 따라서 화면 좌측 상단의 좌표(3Gs 기준)가 (0,0) (320,0) (0, 480) (320, 480) 으로 제각각이다.. 크게 상관 없는 사람들도 있겠지만 나의 경우 이 좌표 떄문에 매우 곤란 했었다..

지금 와서 생각해보면 상위에 전체 화면의 윈도우를 하나 더 띄우고 내부에 뷰로 작업하는 것도 괜찮을 것이라는 생각이 든다.. 필요한 사람은 어떻게든 알아서 해보셔~


아 빼먹을 뻔 했다. 화면 회전 이벤트 감지는
SpringBoard 의 noteInterfaceOrientationChanged 이벤트를 체크하면 된다. 이 부분은 알아서..
한참 트윅제작 강의를 하고 계신 deVbug 님이 써주시거나 내가 곧 쓸 수도 있다.... 




내가 잘못했다거나, 더 좋은 방법이 있지만 몰라서 못 적은 거일 수도 있다. 
혹시나 더 좋은 방법, 혹은 다른 팁 등이 있다면 댓글로 살포시........ㅎㅎ 돕고 삽시다 좀!!! ㅋ 



  1. BlogIcon deVbug 2011.12.09 18:50

    UIWindow를 UIViewController에 넣고
    UIViewController에 있는 로테이션 관련 메소드를 갖다 쓰면 더 편하지 않았을까요?

    아 그리고 제 글은 프로그래밍 강의가 아니기에 노티 사용법 같은건 안 쓸겁니다. ㅎㅎ

    • BlogIcon iolate 2011.12.09 21:13 신고

      어라? 윈도우를 ViewController 안에 넣어도 정상적으로 뜨나요...?

      정확히 이 UIWindow 란 넘이 어떤 넘인지 모르니 헷갈리네요...

      쨋든 전 저렇게 삽질을 해놨습니다..ㅠㅠ 장점은 rotation lock 무시... rotation lock 적용이 되니까 아이패드 유저로 부터 수정해달라는 메일이 와서요...ㅎㅎㅎ 덕분에 그거 하난 쉽게 고쳤네요..ㅋ

    • BlogIcon deVbug 2011.12.09 21:43

      잘못 썼네요.
      UIWindow에 UIViewController의 view를 addSubview 시킨 뒤, UIViewController.view에서 모든 작업을 하는 겁니다.

      딱 한가지 문제가 있다면, 이 view도 로테이션 하려면 수동으로 직접 해줘야하네요.
      자동으로 하게 하면 후킹된 앱의 로테이션이 엉망이 됩니다. ;ㅁ;..

      그리고 직접 적어두셨듯이 UIWindow도 UIView이니까 상관없을거 같긴 합니다.

+ Recent posts