私は自分のアプリケーションのいずれかのUIをカスタマイズしています、とアイデアはときにフォーカスのうちテキスト領域を最初にグレーの縁取りされていることであり、それが焦点になると、ボーダーが明るく白くなります。私のアプリは暗いテーマを使用しており、一列に並んだNSTextField
の場合、これは素晴らしいです。サブクラスNSScrollViewのdrawRect:メソッド
しかし私は、サブクラス化されNSTextView
の問題に実行していますよ。境界線を適切に変更するために、実際に親のサブクラスNSScrollView
をサブクラス化する必要がありましたが、依然として奇妙な動作が見られます。 (下のスクリーンショットを参照してください。)これは素敵な境界線を生成する、(単にテストのためである代わりに、充填、)ストロークのパスを私を許すように私は、全体のスクロールビューを埋めるために赤いボックスが欲しい。代わりに、赤いボックスは内部の子ビューにのみ塗りつぶすように見えます。 NSScrollView
サブクラスのためのものである
次のコードスニペット、下記見た
- (void)drawRect:(NSRect)dirtyRect {
[super drawRect:dirtyRect];
NSRect borderRect = self.bounds;
borderRect.origin.y += 1;
borderRect.size.width -= 1;
borderRect.size.height -= 4;
BOOL inFocus = ([[self window] firstResponder] == self);
if (!inFocus) {
inFocus = [self anySubviewHasFocus:self];
}
if (inFocus) {
[[NSColor colorWithDeviceRed:.8 green:.2 blue:0 alpha:1] set];
} else {
[[NSColor colorWithDeviceRed:.1 green:.8 blue:0 alpha:1] set];
}
[NSGraphicsContext saveGraphicsState];
[[NSGraphicsContext currentContext] setShouldAntialias:NO];
[NSBezierPath fillRect:borderRect];
[NSGraphicsContext restoreGraphicsState];
NSLog(@"My bounds: %@", NSStringFromRect(borderRect));
NSLog(@"Super (%@) bounds: %@", [self superview], NSStringFromRect(borderRect));
}
スクリーンショットを作成します。また、ログ内の出力を参照してください。は、ビュー全体を塗りつぶすことを示すを示唆しています。これは、内部のテキストのサイズに関係なく、今までに示された唯一の出力です。キャリッジリターンを入力すると、赤色のボックスの高さが増加しますが、出力は異なりません。 (そして、私は全体の境界を埋めるために赤ボックスをしたいと思います。)
2011-04-08 21:30:29.789 MyApp[6515:903] My bounds: {{0, 1}, {196, 87}}
2011-04-08 21:30:29.789 MyApp[6515:903] Super (<EditTaskView: 0x3a0b150>) bounds: {{0, 1}, {196, 87}}
編集:おかげで彼の答えのためのジョシュ・キャスウェルへ。焦点が合っていないときと焦点が合っているときの適切な振る舞いについては以下を参照
境界線を常に完全に表示したいのですか、またはテキストビューの端が表示されている領域にのみ表示させますか? – ughoavgfhw
良い質問です。スクロールビューの境界線の周りに、境界線が常に表示されるようにします。境界線は常に表示されますが、最初のレスポンダでないときは明るいグレーで、フォーカスがあると明るい白です。 (暗い背景にあります) –
これはおそらくクリッピングの問題です。 'CGContextGetClipBoundingBox((CGContextRef)[[NSGraphicsContext currentContext] graphicsPort]);'を使って現在のクリッピング矩形を見つけて、それを投稿します。 '[super drawRect:]'を呼び出さないことで問題を解決できるかもしれませんが、NSScrollViewは通常描画を行わないので大丈夫です。 – ughoavgfhw