원래 앱 개발시, 개발자 레퍼런스나 기타 강좌들을 통해 이런 말을 보게 될 것이다.
"아이폰엔 하나의 윈도우(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 님이 써주시거나 내가 곧 쓸 수도 있다.... 




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



솔직히 이런것들 한국인보단 외국인들이 훨씬 많이 보겠지만
영어로 쓰는건 많이 무리가 있으니.....ㅋㅋ

우선 첫번째, 설정에서 Activator Listener 뷰를 가져오는 방법.
THEOS 에 포함된 헤더엔 관련 부분이 빠져 있으니 그냥 https://github.com/rpetrich/libactivator/ 에서 libactivator.h 를 가져오도록 하자.

libactivator.h 임포트 후에
 

LAEventSettingsController *vac = [[[LAEventSettingsController alloc] initWithModes:[NSArray arrayWithObjects:@"springboard"@"application"@"lockscreen"nil] eventName:eventName] autorelease];

[self pushController:vac];


와 같이 호출해 주면 된다. 

근데,, 사실 저 코드 만으로는 문제가 있는게, PreferenceBundle Extension 에서 네비게이션의 뒤로가기 버튼을 누를 경우
-(void)setRootController:(id)controller; 메소드를 호출하게 된다.
따라서  LAEventSettingsController 를 상속받는 새로운 클래스를 만들고 -(void)setRootController:(id)controller; 메소드를 만들어 두자..

수정된듯...


======================================================

다음은 Activator Listener 직접 호출. Activator 에다가 이벤트를 등록하지 않고 직접적으로 호출하는 방법이며, Listener 이름만 알고 있으면 된다.
(참고로 Activator 는 리스프링 직후 트윅들이 Activator 에 이벤트를 등록하면서 넘겨주는 delegate 를 가지고 있다가  activator:receiveEvent:forListenerName: 메소드를 호출해주는, 싱글톤 방법을 사용한다.)

역시나 LibActivator 소스에서 가져오는 libactivator.h 를 임포트 해주고
아래와 같이 해주면 된다.
 

event 는 굳이 안만들고 msgSend 에서 event 대신 nil 값을 넣어줘도 크게 상관은 없다...ㅎㅎ



LibActivator Setting Saving Path :
/var/mobile/Library/Caches/libactivator.plist
(휘바골드 님 수정 요청 감사합니다~ ㅎㅎ)

복원 후 Activator 설정을 다시 해주기 귀찮다면 저 파일을 백업해 놓자.
권한은 mobile/mobile 666 

'Mac, iOS' 카테고리의 다른 글

iOS5, 초기화 하지 않고 iCloud 에서 복원하기  (18) 2012.01.13
탈옥 중 기본 어플 사라짐  (2) 2011.12.19
Mac OS X Lion. 매직마우스 불편 설정 방법  (3) 2011.07.22
맥에서 스캔하기  (2) 2011.07.10
iPhoto 휴지통  (0) 2011.06.04

+ Recent posts