12

これは一般的な質問ではなく、非標準的な外観のアプリを好まない人もいますが、私のアプリケーションには役立ちます.

「標準」の非プライベート API の方法で、NSWindow のタイトルバー テキストの色を変更することは可能ですか?

プライベート API を使用すれば可能であることはわかっていますが (この回答で述べたように)、Pixelmator がそれを行っており、MAS から拒否されていないため、プライベート API なしで実行できると思います。ボーダレス ウィンドウを作成し、自分ですべてを描画することも可能であることはわかっていますが、標準の NSWindow タイトルバーに付属するすべての追加ビットを引き続き取得するため、Pixelmator がそれを行っているとは思いません。ドラッグ可能なアイコン、ウィンドウの名前変更、ドキュメント リビジョンのドロップダウン メニュー、フルスクリーン ボタン。

基本的に、setBackgroundColor: を使用して黒いウィンドウを作成しましたが、テキストは依然として黒として表示され、黒い背景では機能しません。

それで、これを行う方法、またはPixelmatorがどのようにそれを行っているかを知っている人はいますか?

4

4 に答える 4

11

OS X 10.10 以降、ウィンドウの外観を NSAppearanceNameVibrantDark に変更するだけで十分です。

  window.appearance = NSAppearance(named:NSAppearanceNameVibrantDark)

あなたが見つけることができる答えのほとんどは古くなっているので、言及する価値があると思いました.

于 2015-08-27T06:22:14.803 に答える
3

これがSwiftでの解決策です。遅くて疲れているので、これはおそらく最適ではありませんが、うまくいきます。

まず、特定のビューをスキップするオプションを使用して、階層内のビューを検索する関数を次に示します。window.contentView.superview.subviews(これは、検索を行っていて、 内の独自のビューを無視したい場合に便利ですcontentView)

func findViewInSubview(subviews: [NSView], #ignoreView: NSView, test: (NSView) -> Bool) -> NSView? {
    for v in subviews {
        if test(v) {
            return v
        } else if v != ignoreView {
            if let found = findViewInSubview(v.subviews as [NSView], ignoreView: ignoreView, test) {
                return found
            }
        }
    }
    return nil
}

NSViewControllerサブクラスなどからの使用方法は次のとおりです。ウィンドウが表示されたときに行う必要があるため、 では実行できないことに注意してくださいviewDidLoad

override func viewDidAppear() {
    if let windowContentView = view.window?.contentView as? NSView {
        if let windowContentSuperView = windowContentView.superview {
            let titleView = findViewInSubview(windowContentSuperView.subviews as [NSView], ignoreView: windowContentView) { (view) -> Bool in
                // We find the title by looking for an NSTextField. You may
                // want to make this test more strict and for example also
                // check for the title string value to be sure.
                return view is NSTextField
            }
            if let titleView = titleView as? NSTextField {
                titleView.attributedStringValue = NSAttributedString(string: "Hello", attributes: [NSForegroundColorAttributeName: NSColor.redColor()])
            }
        }
    }
}

火遊びをしていることに注意してください。このような内部は、理由により指定されていません。

于 2015-03-29T01:40:27.747 に答える
0

質問へのコメントに記載されているように、プライベート API を使用してこれを解決できますが、そのアプリを AppStore に送信することはできません。

他の解決策は取得すること[[myWindow contentView] superview]です-これにより、前述のNSThemeViewインスタンスが取得されます。次に行う必要があるのは、ビューのサブビュー (実際にはフレーム ビューと呼ばれる) のサブビューで NSTextField のインスタンスを検索し、それらを変更することだけです。これらのプライベート ビューの階層は、OS X のリリースごとに変更される可能性があり、コードが壊れる可能性があることに注意してください。

おそらく最良の解決策は、サブクラス化 (サブクラスのみ、他のカスタマイズなし)とメソッドNSWindowを実装することです。各ウィンドウに対して、実際のタイトルを(を呼び出して) に設定し、プログラムで作成した独自のインスタンスをフレームに配置します。ビュー (つまり、はテキスト フィールドです。フィールドの正確な配置などを把握する必要がありますが、それが最も簡単な部分です。-title-setTitle:@""[super setTitle:@""]NSTextField[[[self contentView] superview] addSubview:myTextField]myTextField

于 2013-06-26T09:02:55.330 に答える