2012-01-09 14 views
3

私はグラデーションの背景とNSOutlineViewサブクラスを実装しようとしています:NSOutlineView勾配の背景

- (void)drawBackgroundInClipRect:(NSRect)clipRect { 
    [gradient drawInRect:clipRect angle:90]; 
} 

それはほとんどになって動作します。私は、ビューのサイズを変更する場合

しかし、勾配「休憩」:

項目によってカバーされる領域を除いて、グラデーションがどこでも適切にレンダリングされています。ウィンドウのキー状態を(別のアプリケーションに切り替えることによって)変更すると、その領域も正しく描画されます。キューアイテムが折りたたまれているかのようになります。私は何が欠けていますか?サイズ変更後にその領域の背景を更新するにはどうすればよいですか?

+1

私はそのカラースキームが特に15以上のキューに向かうときに読みにくくなるのを見ることができます。 –

+0

はい、私は知っていますが、この時点ではグラデーションの作成方法を理解しようとしています。 –

答えて

1

私は次のコードは、それを完璧に動作する、ビューベースNSOutlineViewに移行しなければならなかった:

- (void)drawBackgroundInClipRect:(NSRect)clipRect { 
    [gradient drawInRect:self.frame angle:90]; 
} 
+0

'self.frame'?それは 'self.bounds'ではありませんか? – zneak

2

クリップの矩形は、変更された領域です。必ずしもグラデーションの領域全体である必要はありません。グラデーションを(ビューの可視領域の)上部から開始し、(ビューの可視領域の)下部で終了する場合は、毎回同じ矩形でグラデーションを描画する必要があります。あなたは、その後、your enclosing scroll viewのために自分自身(アウトラインビュー)を頼むことになっているとして、あなたの図面を制限the visible rectためのスクロールビューを尋ねると、convert that rect to the outline view's coordinate systemにスクロールビューを教えてくれます与えられた四角形にクリップする

使用the NSRectClip function

+0

これは私が最後にしたものです: 'NSRect visibleRect = self.enclosingScrollView.visibleRect; NSRect rect = [self.enclosingScrollView convertRect:visibleRect toView:self]; [gradient drawInRect:rect angle:90]; ' 残念ながら、まったく同じように動作します。私はrectの起源とサイズのロギングを追加しようとしましたが、ウィンドウのキー状態を変更すると、同じrectを正確に記録します。サイズを変更したときと同じですが、 "ブレーク"グラデーションのサイズ変更と別のウィンドウへの切り替えは "修正"します。私は何が起こっているのか分かりません。 –

0

私は時にサイズが変更通常、それはdoesnのためのアウトラインビューは、既存のアイテムを再描画しないと思います必要はありません。ビューでNSViewFrameDidChangeNotificationの通知リスナーを追加し、フレームが変更されたときにビューで-setNeedsDisplayを呼び出します。

+0

これを試しても動作しません。私はNSViewFrameDidChangeNotificationをリッスンする代わりに-setNeedsDisplayを-setFrameSizeと呼んでいましたが、違いはないと思います。 –

+0

-setFrameSizeが実際に呼び出されたことを確認しましたか? –

+0

はい、しました。期待どおりに呼び出されています。 –