2012-07-23 2 views
2

두 개의 NSWindow가 있습니다. 창 A 수준 0, 창 B 수준 1. 나는 부동 창으로 B를 사용하고 있습니다.코코아/ObjC : 모달 창 위에 떠 다니는 창 배치

A를 모달 창으로 입력 (예 : runModalForWindow : NSApplication에 메시지 보내기) 할 때까지 예상대로 작동합니다. 그렇다면 B는 항상 A 뒤에 있습니다.

A가 모달 창으로 실행 중일 때도 위의 A를 가질 수있는 방법이 있습니까?

많은 도움을 주셨습니다.

답변

0

윈도우 레벨을 NSScreenSaverWindowLevel로 설정하면 항상 맨 위에 표시됩니다.

1

AFAIK는 가능하지 않습니다. 애플 클래스 참조에서

:

NSApplication runModalForWindow는 :

이 방법은 동 기적으로 지정된 윈도우 에 대한 모달 이벤트 루프를 실행합니다. 지정된 창을 표시하고 키를 만들고 실행 루프 인 을 시작하고 해당 창에 대한 이벤트를 처리합니다. 응용 프로그램이 해당 루프에있는 동안 창이 (마우스, 키보드 또는 창 닫기 이벤트를 포함하여) 다른 이벤트에 응답하지 않는 한 해당 창과 관련이 없습니다 . 또한 은 모달 실행 루프와 연결된 이 아닌 작업 (예 : 타이머 실행)을 수행하지 않습니다. 즉,이 메서드 은 이벤트 처리에 충분한 CPU 시간 만 사용하고 모달 창과 연결된 작업 메서드는 에 전달합니다.

이 경우, 귀하의 창 A는 핵심 창이되고 항상 앱의 다른 창 상단에 표시됩니다. 나는 이것이 모달 윈도우가 작동하는 방법이라고 생각한다.

대안으로 사용자에게 명확한 존재감을 갖지만 응용 프로그램을 모달 상태로 만들지는 않는 NSPopover을 사용할 수도 있습니다.

사용 가능한 다양한 옵션에 대한 지침은 Apple 문서에서 this page을 확인하십시오.

0

orderFront:, orderFrontRegardless 또는 orderFront:relativeTo:을 사용하면 B가 A의 앞에 이동 될 수 있습니다. 그러나 A가 모달이라는 사실 때문에 B에서 할 수있는 작업의 수를 모를 경우 B와 상호 작용할 수 있습니다.

1

부동 창을 앞에 놓으려면 [myfloater setLevel: NSModalPanelWindowLevel+1]을 사용하십시오.

다른 사람들은 플로터와 상호 작용하는 데 어려움을 겪을 것이라고 말하고 있지만 다른 사람들은 플로팅과 상호 작용에 어려움을 겪었습니다. (내 플로터는 NSWindow이 아닌 "유틸리티 패널"스타일의 NSPanel을 사용하지만, 중요한지 확실하지 않습니다. 라고도 할 수 있습니다.)