3

丸みを帯びた角のマスクでうまく再生するために、水平方向にNSTextView埋め込みを行うのに苦労しています。問題を特定するための簡単なテスト アプリケーションを作成しました。NSScrollViewNSRulerView

まず、 の角を丸くするには、基本的に 2 つの方法があるようNSScrollViewです。1 つ目は、 を使用し、CAShapeLayerその path プロパティを目的の角丸四角形のベジエ パスに設定することです。2 つ目は、CALayercornerRadiusプロパティを目的の値に設定してから、そのbackgroundColorプロパティを 1.0 アルファを持つ任意の色 (黒一色など) に設定することです。これらのレイヤのいずれかを使用して、を介してレイヤでバッキングされた後、NSScrollViewのバッキング レイヤのプロパティを設定できます。のバッキングレイヤーに直接適用すると、いくつかの描画アーティファクトが得られますが。代わりに、マスクをのスーパービューのバッキング レイヤーに適用します。スーパービュー自体は単なるコンテナ ビューです。masksetWantsLayer:NSScrollViewNSScrollView

ここで、ルーラー ビューを表示して操作を開始すると、問題が発生します。定規ビュー自体は見栄えがよく、上でマスクを適用したため、角が丸くなっています。ただし、マーカーを追加してドラッグし始めると、マウスを離すまでマーカーが見えないため、マーカーの配置が非常に難しくなります。また、ドラッグ中に標準の垂直マーカー ラインが表示されません。

マスクの存在が原因で発生していることを確認しました。マスクを無効にすると、NSRulerViewは正常に動作します。

問題は、NSRulerViewNSScrollViewの丸みを帯びた角をうまく組み合わせるにはどうすればよいかということです。

NSRulerViewマスク レイヤーが、マウス ドラッグ トラッキング中に発生している一時的な描画を何らかの形で覆い隠しているように見えます。この場合、NSRulerView他の何よりも描画を実行するにはどうすればよいですか? それと他のすべてのビューをレイヤーでサポートし、NSRulerView上記のすべての兄弟ビューを配置しても(適切な測定のために)効果がないようです。

また、サブクラス化NSTextViewしてデリゲート メソッド (およびその他) をオーバーライドしてrulerView:willMoveMarker:描画を強制しようとしましたが、ウィンドウの左下近くの奇妙な場所にマーカーを描画しているように見えますNSRulerView。正しい座標系。ただし、他の場所に強制的に描画しても効果がないため、これは描画アーティファクトであると思われます。

4

0 に答える 0