2009-04-19 8 views

答えて

4

、これはそれを行うには「正しい」方法であれば、私は知らないが、心に来る最初の事はおおよそ次のようになります。これは、NSTextFieldのカスタムサブクラスを作成することです:

- (void)awakeFromNib 
{ 
    [self setDrawsBackground:NO]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    [super drawRect:rect]; 

    [self lockFocus]; 
    [[NSImage imageNamed:@"<#image filename#>"] drawInRect:rect 
     fromRect:rect 
     operation:NSCompositeSourceOver 
     fraction:1.0]; 
    [self unlockFocus]; 
} 

これもまた、必須の部分の概要です。

とにかく、私が言ったように、これを本当に「正しい」方法(または「正しい」方法があれば)が正しいかどうかはわかりませんが、これはあなたに背景を与えますあなたのNSTextFieldの画像。ジョシュアさんのコメントに応じて

編集(私はその小さな小さなコメントボックスに十分なスペースを持っているつもりはありません):

プロジェクトに画像を追加するには、あなたがどこそれからそれをドラッグしたいですプロジェクトウィンドウ(プロジェクトウィンドウの中央にあるファイルのメインリストですが、Xcode編集環境をどのように設定したかによって異なります)がプロジェクトウィンドウに表示されます。

NSTextFieldのサブクラスを作成するために、新しいObjective-Cのクラスファイル(ファイル - >新規ファイルを...)を作成したいと思うが、クラスがNSTextField代わりのNSObjectから継承するようヘッダを編集します。言い換えれば、あなたのヘッダファイルには、次のようになります。

#import <Cocoa/Cocoa.h> 

@interface BGImageTextField : NSTextField 
{ 
} 

@end 

は、コードの残りの部分については、あなたが(例えば、BGImageTextField.m)実装ファイルの本体にそれを追加したいと思う、特に中@implementation@endの間にあります。

私は2つのことについても言及したいと思います。最初に、Aaron HillegassのCocoa Programming for Mac OS Xをお勧めします。これはAaron Hillegassによってココアの基本のほとんどをカバーしており、一般的にココアを学ぶ最良の方法の1つです。第二に、私のアプローチはうまくいっていますが、おそらく最近私がthis postを見つけたばかりなので、NSTextFieldを拡張するより良い方法を示唆しているようです。

+2

上記の例では、textFieldのセルは描画されません。 [super drawRect:rect]を追加するとそれの終わりに、それとフォーカスリングの描画が再び動作するはずです。 setDrawsBackgroundをNOに設定しているので、superのdrawRectは何も上げてはいけません。物事を混乱させるかもしれない別のものは、fieldEditorの背景の描画です。それについてはわからない。最終的なこと:描画のパフォーマンスが悪くならないように、textFieldには近くに不透明な祖先があることを確認する必要があります。 –

+0

ああ、良い点 - 私はそれを反映するために投稿を編集しました。 (何らかの理由で、最初に試したときにdrawRectを呼び出すと、背景画像が描画されます)一般的には、この問題に近づけるより良い方法があることを願っています。今のところハックのような感じです。 – hbw

+0

ありがとうございます、しかし、余分な質問が1つありますが、どこに背景画像を配置しますか? – Joshua

3

NSTextFieldをサブクラス化する代わりに、背景色を透明にして[NSColor clearColor]にして、そのイメージを後ろに置くだけです。

+0

私はちょうどそれを試み、それは私のために非常にうまくいかない。しかし私はそのアイデアが気に入っています。私の方法よりもずっと簡単です。 – hbw

関連する問題