それで、私は 2013 年冬のスタンフォード iOS/Objective-C クラスの 2 番目の課題を iTunes U を通じて進めています。
カードマッチングゲームです。各カードは、ビューで UIButton として表されます。カード オブジェクトが表向きの場合、UIButton は選択状態になり、カードが裏向きの場合、UIButton はデフォルト状態になります。一致が見つかった後、カードを無効にすることもできます。
課題では、カードの裏に画像を配置するように求められます。つまり、各 UIButton は、既定の状態のときは画像を表示する必要がありますが、選択状態または無効状態のときは title プロパティのみを表示する必要があります。
十分に単純に思えます...
まず、GUI (ストーリーボード) でこれを試し、背景画像を自分の画像に設定してから、選択状態と無効状態の両方に画像がないことを確認しました。これにより、画像が表示されましたが、タイトルテキストが画像の上に表示されました。一部の検索で、この理由が明らかになりました。明示的に指示されない限り、UIButton は他のすべての UIControlStates を UIControlStateNormal にデフォルト設定します。
今、私はこれをプログラムで動作させようとしていますが、まだうまくいきません。カードであるすべての UIButtons は、NSArray (cardButtons) である IBOutletCollection にあります。viewDidLoad 関数には、すべてのボタンを通過する for ループがあります。
UIImage *cardBack = [UIImage makeSomeImage...];
for (UIButton *oneButton in cardButtons) {
[oneButton setBackgroundImage:cardBack forState:UIControlStateNormal];
[oneButton setBackgroundImage:nil forState:UIControlStateSelected];
}
それでも同じ問題が発生します。デフォルト状態の画像を確実に正常に設定していますが、シミュレーターでボタンをクリックすると、タイトルが単にその上に表示されている間、画像が残ります。
GUIとプログラムの両方で、別の画像を選択して無効な状態で表示することができます。私がしなければならないのは、追加することだけです:
[oneButton setBackgroundImage:anotherImage forState:UIControlStateSelected];
ループとすべてのボタンを選択すると、他の画像が表示されます。
私ができないこと、そして私を夢中にさせているのは、UIButtonがタイトルのみを表示するように、選択時に背景画像がないようにしようとしていることです...
編集:
理想的な解決策ではありませんが (UIButton の imageView プロパティを使用して何かが可能かもしれないと思いますが、よくわかりません)、これを機能させるためのやや凝った感じの方法を思いつきました。
最初に、使用している UIImage を cardBackImage というクラス プロパティにしました。
次に、モデルに変更が加えられるたびにすべてのカード ボタンをループする updateUI 関数に、次のコード行を追加しました。
[cardButton setBackgroundImage:(oneCard.isFaceUp ? nil : self.cardBackImage) forState:UIControlStateNormal];
したがって、カード オブジェクトが「反転」されるたびに、UIButton はそのインスタンス変数に UIImage をロードまたはアンロードする必要があります。ブレ...私が言ったように、理想的ではありませんが、うまくいきます。