2009-05-19 5 views
1

非常に基本的なチェックボックスであるUIButtonサブクラスを構築しました。すべてが機能しています(たとえば、私が期待しているイベントを取得しています。私が期待したときにdrawRectメソッドが呼び出されます)。しかし、イメージは描画されません。私は自分のイメージがゼロではなく、イメージが異なることを確認しました。チェックボックスの図面で何が問題になっていますか?

コード:

-(void)awakeFromNib { 
    [super awakeFromNib]; 
    [self addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside]; 
    self.state=YES; 
} 

-(void) buttonClick { 
    self.state = !self.state; 
    [self setNeedsDisplay]; 
} 

-(void)drawRect:(CGRect)rect { 
    UIImage *img = nil; 
    if (self.state) { 
     img = [self backgroundImageForState:UIControlStateSelected]; 
    } 
    else { 
     img = [self backgroundImageForState:UIControlStateNormal]; 
    } 
    [img drawInRect:rect]; 
} 

それが描かれる前に、 'IMG' の値を確認するには:

Printing description of img: 
<UIImage: 0x52a710> 
(gdb) continue 

Printing description of img: 
<UIImage: 0x52a5d0> 

背景画像は、NIBに設定されています。 IBで選択した状態を変更すると、適切なイメージが表示されます。私はまた、コールから有効なイメージを取得しています(NIBに設定されていないimageForStateを取得しようとしない場合)。

サブクラスの理由は、チェックボックスが必要なためです。 UIButtonはそうしておらず、UISwitchは、最も功利主義的な見解を除いて、醜悪で醜いです。

思考?

ありがとうございました。

TJ

編集:あなたがbackgroundImageForStateを設定しているサブクラス

答えて

0

UIImageがnilでないという理由だけで、画像データが含まれているわけではありません。

ファイル名の大文字と小文字を確認してください。
私はこれを何回もやりました:

@ "CheckBox.png"と@ "checkbox.png"はiPhoneとは2つの異なる名前です。

少し早めに最適化しているようですね。

私は最初の選択肢のためにdrawRect:に潜んでいません。

UIButtonサブクラスを使用します(状態を追跡するためにサブクラス化する必要があります)。 IBでボタンを上にして、希望の位置に配置します。以下の方法にボタンを接続し、単にクリックで画像を入れ替える:

- (IBAction)toggle:(id)sender{ 

    MyButtonSubClass *aButton = (MyButtonSubClass*)sender; 

    [aButton toggleChecked]; 

    if(aButton.checked) 
     [aButton setImage:checkedImage forState:UIControlStateNormal]; 
    else 
     [aButton setImage:uncheckedImage forState:UIControlStateNormal]; 


} 

オプションで、UIButtonのサブクラスを作成し、コントローラ

2

のためのすべてのコードを追加しましたか?それが正しいイメージであると確信していますか? iPhone OSはデフォルトとして透明な(空白の)画像を表示している可能性があります。

第2に、渡された「rect」パラメータを使用して画像を描画しません。それは、あなたが再描画することを望む領域を示しているだけで、必ずしもそうではありません。代わりに

CGRectMake(0, 0, img.size.width, img.size.height)

または類似のものを使用。

最後に、カスタム図面をやっているのはなぜですか?私は非常に似たようなことをやってきましたが、サブクラス化と実装は絶対に必要ありませんdrawRect。 UIButtonには、ユーザーインタラクションで自動的に描画される「強調表示」や「選択」画像など、画像用に豊富なオプションが組み込まれています。あなたが達成する必要があるものをお知らせください。

+0

状態を追跡することはできません私はあなたの最初のセットに関する上記の質問に詳細を追加しました質問。私がシミュレータに入るのは、NIBで設定したデフォルトの画像です。私はチェックボックスがコードからではなく、NIBにシリアル化されるときから来ていると思います。 自分のrectを使用するようにコードを変更しました(これは私が渡されたのと同じです)、それには影響しませんでした。 私はすべてのコードを追加して、カスタム図面が表示されるようにしました。 UIButtonは私が必要とすることをしません。 –

+0

私はこのことをより良いやり方にすることができます。ユーザーがボタンをタップしていなくても、「選択状態」を維持できる必要があります。 –

関連する問題