丸みを帯びた角のマスクでうまく再生するために、水平方向にNSTextView
埋め込みを行うのに苦労しています。問題を特定するための簡単なテスト アプリケーションを作成しました。NSScrollView
NSRulerView
まず、 の角を丸くするには、基本的に 2 つの方法があるようNSScrollView
です。1 つ目は、 を使用し、CAShapeLayer
その path プロパティを目的の角丸四角形のベジエ パスに設定することです。2 つ目は、CALayer
のcornerRadius
プロパティを目的の値に設定してから、そのbackgroundColor
プロパティを 1.0 アルファを持つ任意の色 (黒一色など) に設定することです。これらのレイヤのいずれかを使用して、を介してレイヤでバッキングされた後、NSScrollView
のバッキング レイヤのプロパティを設定できます。のバッキングレイヤーに直接適用すると、いくつかの描画アーティファクトが得られますが。代わりに、マスクをのスーパービューのバッキング レイヤーに適用します。スーパービュー自体は単なるコンテナ ビューです。mask
setWantsLayer:
NSScrollView
NSScrollView
ここで、ルーラー ビューを表示して操作を開始すると、問題が発生します。定規ビュー自体は見栄えがよく、上でマスクを適用したため、角が丸くなっています。ただし、マーカーを追加してドラッグし始めると、マウスを離すまでマーカーが見えないため、マーカーの配置が非常に難しくなります。また、ドラッグ中に標準の垂直マーカー ラインが表示されません。
マスクの存在が原因で発生していることを確認しました。マスクを無効にすると、NSRulerView
は正常に動作します。
問題は、NSRulerView
とNSScrollView
の丸みを帯びた角をうまく組み合わせるにはどうすればよいかということです。
NSRulerView
マスク レイヤーが、マウス ドラッグ トラッキング中に発生している一時的な描画を何らかの形で覆い隠しているように見えます。この場合、NSRulerView
他の何よりも描画を実行するにはどうすればよいですか? それと他のすべてのビューをレイヤーでサポートし、NSRulerView
上記のすべての兄弟ビューを配置しても(適切な測定のために)効果がないようです。
また、サブクラス化NSTextView
してデリゲート メソッド (およびその他) をオーバーライドしてrulerView:willMoveMarker:
描画を強制しようとしましたが、ウィンドウの左下近くの奇妙な場所にマーカーを描画しているように見えますNSRulerView
。正しい座標系。ただし、他の場所に強制的に描画しても効果がないため、これは描画アーティファクトであると思われます。