3

Cocoa を使用して小さな Finder クローンを作成しようとしています。ソース リスト テーブル ビュー (サイドバーとして機能するため) と標準テーブル ビューをNSSplitViewによって制御される内に配置していNSSplitViewControllerます。残念ながら、これを実行すると、標準のテーブル ビューの白い背景がウィンドウの右下隅に描画され、角が丸くなくなります。 右下隅を重ねて描画

を使用しないことで問題を回避できNSSplitViewControllerます。標準の nib ファイルまたはストーリーボードの両方で、目的の結果を得ることができます。

NSSplitViewController がなくても、正しく描画されます

でも…どうしても使いたいNSSplitViewController。これを防ぐ方法はありますか?

スクリーンショット用のプロジェクトを含む Xcode ワークスペースを次に示します

4

2 に答える 2

3

私はそのような問題を見てきましたが、それは本当のバグのようです。しかし、それには回避策があります。NSSplitViewController が、CA レイヤーによってサポートされているビューでそれ自体をレンダリングすることを確認する必要があります。プロジェクトでこれを行うために、中間者ビュー コントローラーとコンテナー ビューを追加しました。次に、このコンテナ ビュー内に分割ビューを配置しました。最後に、コンテナー ビューの親ビューがレイヤーに基づくように設定されます。ここに写真があります:

ここに画像の説明を入力

その後、すべてが正常に表示されます。

ここに画像の説明を入力

別の注意: 本当に必要になるまで、優先度 1000 の制約を使用しないでください。私は通常750を使用します(それも修正しました)。そうしないと、満足できないことについて多くの警告が表示されます。

修正したプロジェクトは次のとおりです: https://github.com/emankovski/splitviewroundcorrners

于 2016-07-03T01:48:57.567 に答える
1

ビュー階層にルート ビューを追加するに、ビュー階層のルート ビューがレイヤーでサポートされていることを確認してください。

例。これは機能します。macOS 10.12 Sierra で動作確認済みです。Xcode 8.0。

split.view.wantsLayer = true
window.contentViewController = split
split.splitViewItems = [
    NSSplitViewItem(viewController: vc),
]

しかし、これはそうではありません。

window.contentViewController = split
split.splitViewItems = [
    NSSplitViewItem(viewController: vc),
]
split.view.wantsLayer = true

ここで何が起こっているのか、なぜこれが機能するのかわかりません。しかし、推測させてください。

NSWindowレイヤーバッキングのないルートビューは、コンポジターを使用せずに単純に描画します。そのため、コーナーをマスクすることができず、そのようなアーティファクトが表示されます。それらをレイヤーでバックアップするだけで機能します。@Eugeneが指摘したように。

すべてをレイヤーベースにすることは難しくありません。ルート ビューをレイヤーでサポートするようにするだけで、階層内のすべてのサブビューがリーフでレイヤーでサポートされます。(詳細は RTFM: CALayer.wantsLayer.)

于 2016-10-15T08:39:57.773 に答える