일전에 소개 해드린 TWUI를 살짝 분석한걸 얘기해볼까 합니다.

http://taehoonkoo.tistory.com/190

아래 코드는 TWUI Sample에서 긁어온 소스입니다.


TUINSView *tuiTableViewContainer = [[TUINSView alloc] initWithFrame:b];

[tableViewWindow setContentView:tuiTableViewContainer];

[tuiTableViewContainer release];

ExampleView *tableExample = [[ExampleView alloc] initWithFrame:b];

tuiTableViewContainer.rootView = tableExample;

[tableExample release];



현재 TUINSView와 ExampleView Class 의 Object를 생성하고 있는데,
여기서 ExampleView 는 TUIView 의 sub Class 입니다.

그럼 말하고자 하는 TUINSView 와 TUIView 의 object들인 셈이죠.

결론 부터 말하고 넘어가면, TUIView는 NSView의 sub class 가 아닙니다.
NSResponder의 SubClass 입니다.

이말인 즉슨, NSView에 바로 addSubView해서 사용할수 없는것이죠.

그래서 TUINSView라는 녀석이 있고, 이녀석이 Container역할을 해서
NSView와 TUIView 를 연결 시켜 주게 됩니다.

구현체를 좀더 살펴보니,
TUIView 가 가지고 있는  CALayer Object를 TUINSView의 layer에 addSubLayer하는 형식으로 되어 있습니다.
iOS 스타의 Animation을 구현하기 위해서, NSView자체보다 CALayer를 사용한 것같은데..
직관성이 상당히 떨어 지는 군요.
NSView를 subclassing 하고, 해당 NSView의 CALayer를 활용하는 방식도 가능했을텐데.. 말이지요.

"왜 이런 구조 여야만 했는가? " 에 대한 질문은 아직 깊이있게 살펴보지 않아서,.. ㅎㅎ
좀더 알게 되면 Posting하도록 하겠습니다.






 




LSUIElement 는 OSX Application Activation Policy 와 관련 있는 옵션입니다.. (.plist 파일에서 설정 )


보통 FaceTab for Facebook 과 같은 Status Bar Item base Application 에서 사용하는 옵션입니다.
해당 옵션을 키면, Dock에 노출되지도 않고, Menu가 노출되지도 않습니다.



NSApp이 NSApplicationActiviationPolicyAccessory로써 동작하게 되는것이죠.
 

    /* The application does not appear in the Dock and does not have a menu bar, but it may be activated programmatically or by clicking on one of its windows.  This corresponds to LSUIElement=1 in the Info.plist. */
    NSApplicationActivationPolicyAccessory, 

 

주석에 나와 있는데로, User가 click 을 하거나, 소스코드상에서 강제로 Activate 시키지 않으면 실행이 되지 않습니다.
그래서, 환경설정등을 위해 Window를 띄워도 아래와 같이 Deactivate된 상태로 노출되게 됩니다. 



이를 해결 하기 위해서 아래의 한줄만 써주면 됩니다.

    [NSApp activateIgnoringOtherApps: YES];


OSX 개발 newbie 라... 이런 모드가 있는지도 몰랐고 ;ㅂ;
저 한줄의 코드를 찾기위해, 1시간 가량 구글이랑 놀았습니다. ㅠㅠ
  

https://github.com/Mozketo/LaunchAtLoginController

최근 시작하려고 하는 프로젝트중에 하나가, OSX application이라 이래저래 기술 조사를 하고 있습니다 ㅎ
구현해야하는 기능중에 하나가, Mac이 실행될때, application이 자동 실행되는것인데요,
이래저래 살펴보다가 깔끔하게 정리하고 공유된것이 있어서 소개 드립니다.


Project에 소스를 포함시키고. 아래 method 하나 호출해주면 됩니다.

[self.launchAtLoginController setLaunchAtLogin:YES];

 

내부를  살짝 살펴보니, 

LSSharedFileList 라는 Framework Method들을 사용하고 있는데요,
이게 바로 LaunchService를 담당하는 모듈입니다.
LSSharedFileList에 대한 자세한 설명은 


 
실해시켜보니, 자알 들어갑니다 :)

덧.

Code를 살펴보니, Code 제스타일은 아니지만, 나름 Key-Value Observing도 할수 있게, 잘 되어 있습니다.
안심하고 쓰셔도 될 소스라고 생각됩니다 :) 

Tiger 혹은 그 이하 Version에서는 동작하지 않습니다. 

NSWorkspace *wc = [NSWorkspace sharedWorkspace];
NSString *urlString =@"http://taehoonkoo.tistory.com";
NSURL *url = [NSURL URLWithString:urlString];




참고 자료 :

http://stackoverflow.com/questions/2965615/open-url-with-safari-no-matter-what-system-browser-is-set-to

 

+ Recent posts