키 윈도우가 이동하지 않는 패널을 만든다 (NSFontPanel 같은)

2937 단어 MacOSX코코아

목적



타이틀이 길지만 NSFontPanel (혹은 NSColorPanel) 같은 거동을 하는 NSPanel을 만들고 싶다.

메모 .app 어째서 폰트 패널을 조작해 보면 이하와 같은 움직임을 한다.
  • 활성은 항상 메인 윈도우 (타이틀 바의 문자가 회색 아웃하지 않는다)
  • 패널 위를 클릭해도 패널이 활성화되지 않습니다
  • 패널의 제목 표시 줄을 클릭하면 패널이 활성화됩니다
  • 비활성 상태에서도 패널의 테이블이나 버튼과 같은 부품을 조작 할 수 있습니다



  • 이것을 어떻게 만들 것인가,

    방법



    과장에 쓰고 있지만 실제로는 간단했다.
  • 패널의 서브 클래스를 만든다 (MyPanel 라든지)
  • 인터페이스 빌더로 배치한 패널의 Custom Class를 MyPanel로 한다
  • MyPanel의 awakeFromNib 등에서 setBecomesKeyOnlyIfNeeded : 메소드 호출

  • MyPanel로 구현
    -(void)awakeFromNib
    {
        [self setBecomesKeyOnlyIfNeeded:YES];
    }
    

    이것만.

    h tp // 여기 아아피. 하테나 bぉg. 코m/엔트리/00000226/레시 D37326에 따르면
    必要な時だけキーウインドウになるかを返します。
    初期設定はNOを返します。
    

    라는 것.

    「액티브한 윈도우 = 키 윈도우」라고 하는 이해로 좋을까. 확실히 키 이벤트를 받는 것은 액티브한 윈도우이므로 맞는 것 같다.

    출처



    [TODO]

    -

    보충 1



    setBecomesKeyOnlyIfNeeded는 본래 NSView의 needsPanelToBecomeKey 메소드와 쌍으로 사용하는 것 같다.
    パネルがキーウインドウになるかを制御する
    サブクラスでオーバーライドして使います。
    

    「패널 안에 있는 뷰로부터 요구를 받았을 때만 액티브하게 된다」라고 하는 것. 이번에는 요청을 내는 뷰가 없기 때문에 패널이 활성화되지 않는다.

    폰트 패널의 오른쪽 상단에 있는 폰트 사이즈 지정의 NSTextField를 클릭하면, 패널이 액티브하게 된다. 수치를 입력하기 위해서 패널이 키 윈도우가 되었다고 하는 것이지만, 아마 NSTextField의 needsPanelToBecomeKey는 YES를 돌려주게 되어 있다고 추측할 수 있다.

    보충 2: 커스텀 뷰를 패널에 태울 때



    이 방법으로 독자적인 UI 부품을 패널에 올려 사용하고 싶을 때는, NSView의 acceptsFirstMouse 메소드를 오버라이드(override) 한다. 이것을 사용하는 것으로, 패널의 활성화만으로 사용되고 있던 최초의 마우스 이벤트도 뷰에 통지되게 된다. 반대로, 이것을 구현하지 않으면 UI 부품에 대한 클릭 이벤트를 주워받을 수 없다.
    -(BOOL)acceptsFirstMouse:(NSEvent *)theEvent
    {
        return YES;
    }
    
    アクティブでない時、マトリックスをマウスダウンしたときに呼ばれます。
    サブクラスでオーバーライドします。YESを返すと、アクティブでない時、マトリックスをクリックすると、アプリケーションはアクティブになりウインドウは前面にきて、マトリックスがクリックされメッセージを送信します。NOを返すとアプリケーションはアクティブになり、ウインドウは前面になりますが、マトリックスをクリックしません。
    

    좋은 웹페이지 즐겨찾기