2011-01-08 3 views
9

透明なNSViewに透明なPNG画像を配置する必要があるアプリケーションを作成しています。問題は、私が描いているNSViewに灰色の背景があることです。私はそれをTransparentRectangleViewとしてサブクラス化しましたが、透明にするためにdrawRectに何を入れるべきか分かりません。透明な背景を持つようにNSViewをサブクラス化する

私はすでにNOを返すようにイソパークメソッドをオーバーライドしているが、助けていないよう

...

また、限り、私はできる限り、すでにiPhoneのUIImageViewに似ているサブクラスのNSView(あり内部にサブビューを追加、内部にテキストを追加する必要があります)。

+1

がInterface Builderで透明度のスライダーではないですか?私は私の意見の不透明さを誤って覚えているように思います。 –

+1

子供を含めて全体の透明度を設定することはほぼ100%確信しています。それは私のボタンとテキストのすべてが1%の不透明度を持つことを意味します。私が間違っている場合は、私に知らせてください:D –

+1

お待ちください、透明な背景色がほしいですか? UIViewにはNSViewsで使用しようとはしませんでしたが、使用できる定義済みの透明色があります。 –

答えて

16

ビューを透明にするには、単純に[NSColor clearColor]と入力します。あなたはそれをオーバーライド心配する必要はありませんいくつかの他のビューのNSViewをサブクラス化していませんので、もしイソパークの

- (void)drawRect:(NSRect)rect { 
    [[NSColor clearColor] set]; 
    NSRectFill(rect); 
} 

デフォルトの実装では、NOを返しません。

+0

これは将来的に非常に便利です!ありがとう! –

+4

ちなみに、 'drawRect:'を空白にしておくと、何も描画しないので同じ効果が得られます。私はこれを頻繁に行うので、妥当な確信=確実。 – d11wtq

+0

ウィンドウを不透明に設定しない限り、コードは黒い四角形を描きます(ウィンドウではなく、ビューではありません!NSViewはデフォルトでは不透明ですが、NSWindowはデフォルトでは不透明です)。このテキストも参照してください。http://www.drissman.com/blog/archives/2009/10/09/nsrectfill_and_nscolor_clearcolor.htmlしたがって、ウィンドウについて言及するか、テキストに示されているようにNSRectFillUsingOperationを使用します。あなたのビューが階層化されている場合は、独自の描画レイヤーを持つように、ああ、それはまた動作します。 – Mecki

10

私の窓が不透明なので、受け入れられた答えは私のためには機能しません。前記http://www.drissman.com/blog/archives/2009/10/09/nsrectfill_and_nscolor_clearcolor.html(および以下の議論)として、以下のコードは動作します:

- (void)drawRect:(NSRect)rect { 
    [[NSColor clearColor] set]; 
    NSRectFillUsingOperation(rect, NSCompositeSourceOver); 
    // do other drawings 
} 
+1

SourceOverは、ほとんどの場合、デフォルトの合成操作です。これは '[NSBezierPath fillRect:]'と変わらず、 'NSCopyCompositeOperation'を(普通ではなく)使用する' NSRectFill'より効率が悪く、有効性も低くなります。そして、d11wtqが受け入れられた答えで言うように、これは必ずしも必要ではありません。ビュー自体は、あなたが別の方法で描く場所を除いて既に透明です。 –

+0

@PeterHoseyあなたはリンクのテキストに何が書いてあるのか読んだことさえありますか?いいえ、それは同じではありません。透明な色のNSRectFillは、ウィンドウが明示的に非不透明に設定されていない場合にのみ機能しますが、実際にウィンドウが不透明であれば多くの計算時間を無駄にします。ウィンドウが不透明であるかどうかにかかわらず、NSRectFillUsingOperationは正しく動作します。リンクのテキストはこれを非常にうまく説明し、ちょうど私の仕事のトンを節約しました。 – Mecki

0

スウィフトバージョン:

override func draw(_ dirtyRect: NSRect) { 

    NSColor.clear.set() 
    dirtyRect.fill() 
} 
関連する問題