web-dev-qa-db-ja.com

UIButtonsetImageが機能しない

私はこれに頭を悩ませています。 UIButtonをアウトレットとして接続しています。画像を変えたいです。 viewDidLoad関数で、次のように画像を設定しようとします。

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

何も起こりません。ただし、ImagePickerを使用すると、どういうわけか機能します。 ImagePickers関数「didFinishPickingImage」で、画像を設定するために上記とまったく同じコマンドを繰り返し、それが機能し、画像は正常に表示されます。

ボタンの画像自体が更新されていないのではないかと思っていましたが、[button1 setNeedsDisplay]、[button1.imageView setNeedsDisplay]、さらには[button1.imageView.imagesetNeedsDisplay]を呼び出そうとしても何も起こりません。

誰かがこれについて何か考えを持っていますか?私は今までに2時間も無駄にしていますが、その理由は信じられないほど愚かであるに違いないと確信しているので、本当にイライラしています。

22
detra83

同様の状況に陥る人のために。テーブルビューのカスタムセル内で前述のボタンを使用していました。ただし、セルはすぐには読み込まれません(つまり、viewDidLoad/viewWillAppear内など)が、tableView:cellForRowAtIndexPath関数内に読み込まれます。その時点で、私のボタン変数はすべてゼロでした。私の解決策は、セルが作成された後に画像をロードし、その後すぐに機能するようにすることでした。

7
detra83

ボタンの種類を確認してください。

ボタンの種類が「システム」の場合は、「カスタム」に変更する必要があります

84
Vlad

ここで行う2つのこと:

#1、コードを次のように変更します。

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

および#2

uIImageが有効な画像を返すことを確認してください。

言い換えると、

UIImage * imageToSet = [UIImage imageNamed: @"house.png"];
if(imageToSet)
{
    [button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];
} else {
    // if you see this line in your console, then you know where to look for a problem
    NSLog( @"why is my image object nil?");
}
9

ここにいくつかの追加のメモがあります。 UIButton setImage:forState:は正しいメソッドです:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

imageNamedは、画像を取得するための非常に便利なメソッドですが、オブジェクトを返すようにしてください。現在のターゲットに画像ファイルを含めるのを忘れると、いつも私を捕まえます。

[UIImage imageNamed:@"house.png"] 

また、拡張機能は必要ありません。 SDKはこれを解決します。

[UIImage imageNamed:@"house"] 

また、UIControlStateはビットマスクですが、値を一緒にORすることはできません。これは機能しません。呼び出しを使用するたびに取得されるため、これを覚えておく必要があります。

// NO NO NO
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal|UIControlStateSelected]; 

// YES
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateNormal];
[button1 setImage:[UIImage imageNamed:@"house"] forState:UIControlStateSelected]; 
3
Dan Loughney

UIbuttonUITableViewCellにあるときに同じ問題が発生していました。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"detail.png"] forState:UIControlStateNormal];

UITableViewCellで動作するはずです

2
Wasim

問題が解決したことを知ってうれしいですが、実際に問題に対処している答えはありません。

一般に、コードが正しければ、エラーは「構文エラー」から「論理エラー」カテゴリにシフトします。それを処理するための明確なガイドはありませんが、コードのトラブルシューティングに役立つ小さなチェックリストがあります。

1)IBOutletが接続されていないか、名前が変更されていません。

2)UIButtonタイプがcustomであることを確認します。

3)画像がコード内の別の場所に(複数回)設定されている。

4)メインスレッドを使用していないsync methodを介してイメージを設定しようとしています。 (それだけでいくつかのスレッドがあります)。

5)画像をサブビューとしてネストしている場合は、問題が親ビューにないことを確認してください。

6)シミュレーターに表示されているがデバイスには表示されていない場合は、大文字(大文字、コードとファイル名の小文字の違い)です。

7)最新のシミュレーターは非常に低GPUメモリ古いマシンで動作します。シミュレータオプションを微調整して表示することができます。たとえば、(コマンド+右矢印)を2回押してシミュレータの向きを変更すると、変更が表示されます。

開発者が通常見落としている他のいくつかの一般的な落とし穴があります

1)画像が存在しませんORスペルミスをしています。

2)ファイルタイプが記載されているものと異なります。 (JPG、PNG)。

1
Naveed Abbas

最後に確認したいのは、メインスレッドに画像を設定していることを確認することです。 ALAssetLibraryからのコールバック(写真ライブラリから画像を取得する)でボタン画像を設定していたときに問題が発生しました。ボタンをタップするまで画像は更新されませんでした。コールバックがメインから発生していたことが判明しました...

1
tyler

画像の場合、参照としてではなくコピーとしてプロジェクトにインポートする必要があります。したがって、プロジェクトにファイルを追加するときは、「フォルダ参照の作成」ではなく「グループの作成」を選択します。また、「必要に応じてアイテムをコピーする」がチェックされていることを確認してください。

画像をテクスチャとして使用している場合(スプライトなど)、参照としてインポートが機能するため、これは混乱を招きます。ただし、ボタンに画像を使用する場合([UIImage imageNamed:@"house.png"]で画像名を使用する場合など)は機能しません。

0
Elendurwen

私にとって、それは線を動かすことでした:

[button1 setImage:[UIImage imageNamed:@"house.png"] forState:UIControlStateNormal];

awakeFromNibメソッドから

viewDidLoadメソッドへ

0
evya

これは、デフォルトで一度クリックするとボタンの状態が選択されたままにならないために発生します。そのボタンをクリックしてIBactionを実行し、選択した状態を切り替えることで解決しました。 -(IBAction) checkButtonClicked:(id)sender{ checkButton.selected = !checkButton.selected; }

0
palzarena

SetBackgroundImage:forStateを使用します:

0
Ravikant

このように作成しないでくださいUIButton * nextButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];このcreateメソッドでは、UIButtonはデフォルトのタイプを使用して作成されるため、背景画像は機能しません。これを試してください、UIButton * nextButton = [[UIButton alloc] initWithFrame:CGRectMake(9、154、300、48)];またはその他、buttonWithTypeを除く

0
gestFly

私の場合、カスタムアニメーションコードで描画されており、画像では設定されていないため、画像を設定しても機能せず、アニメーションコードを変更する必要があります。

0
Yao Li