2016-04-06 19 views
3

Cocoaを使用して小さなFinderクローンを作成しようとしています。私はNSSplitViewControllerで制御されているNSSplitViewの中に、ソースリストテーブルビュー(サイドバーとして機能する)と標準のテーブルビューを配置しています。私は使用しないことで問題を回避することができるよ Bottom right corner drawn overNSSplitViewControllerにより、ビューにウィンドウコーナーを描画させる

:私はこれを実行すると 残念ながら、標準テーブルビューの白い背景は非丸みを帯びたコーナーで、その結果、ウィンドウの右下隅の上に描かれていますNSSplitViewController、標準nibファイルやストーリーボードとの両方の目的の結果を得るために:

Correctly drawn, albeit without NSSplitViewController

しかし&hellipを。私は本当にNSSplitViewControllerを使いたいです。これが起こらないようにする方法はありますか?

Here is the Xcode workspace with the projectsスクリーンショットの場合

答えて

2

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

enter image description here

enter image description here

その後、私は罰金のすべてを見ることができますあなたはそれが本当に必要とされるまで制約の1000年の優先順位を使用してはいけないことを確認してください。私は通常750を使います(それも修正しました)。さもなければあなたは満足していない事について多くの警告を得るでしょう。階層を表示するためにそれを追加すること前にビュー階層のルートビューは、層担保ことがあることを確認します https://github.com/emankovski/splitviewroundcorrners

+0

ウィンドウコンテンツビューのレイヤバッキングは、パフォーマンスとバッテリ寿命にどの程度影響を及ぼしますか?おそらく、ビューがデフォルトでレイヤーに裏打ちされていない理由があるはずです。私は固定プロジェクトをダウンロードし、すべての制約優先順位を1000に変更し、満たされない制約エラーを受けていないようです。もともと1000を使用していたのは、これがIBのデフォルトであるためですが、常に最適ではないことがわかりました。 – Nik

+0

これは実際にあなたのバッテリー寿命を向上させます。レイヤーバックアップされたビューはGPUを利用します。理論的には、すべてのビューはiOSで起こるようにレイヤーにする必要があります。後でCAがMacに追加されたため、より多くのメモリを消費するため、慎重にレイヤーを使用するための推奨事項がいくつかあります。同時に、現在のMacBookには多くのRAMがあるため、レイヤーバックアップされたビューを過度に使用しても問題にはなりません。レイヤーは、プラットフォームが作成された後にMacに追加されたため、デフォルトではチェックされません。 –

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 

私はここで何が起こっているかわからない、なぜこれが動作します。しかし、推測させてください。

レイヤーバックビューのルートビューを使用しない場合は、コンポジットが含まれていない状態で単純に描画されます。だから彼らは角を覆い隠すことができず、そのような人工物が現れます。レイヤーをバックアップするだけで機能します。 @Eugeneが指摘したように。

すべてのレイヤーバックアップは難しくありません。ルートビューをレイヤーバックアップにするだけで、階層内のすべてのサブビューがレイヤーバックされてリーフになります。 (詳細についてはRTFM:CALayer.wantsLayer

関連する問題