質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

5108閲覧

UIButtonにセットされた画像をコードで変更する方法

dddd12233

総合スコア13

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2020/03/22 02:26

UIButtonにセットされた画像をコードで変更する方法を教えてください

現在、UIButtonにこのようなXcodeに最初から用意されている(system)ハートの画像を設定しています。
イメージ説明
イメージ説明

このボタンが押された時に、現在設定している"heart"から,
同じくXcodeに最初から用意されている(system)"heart.fill"に画像を変更したいのですが、やり方を教えていただきたいです。

試したコード

@IBAction func iineButtonTapped(_ sender: IineButton) { let good = UIImage(named: "heart.fill") sender.setImage(good, for: .normal) }

このようにボタンが押された時にsetImage()メソッドを使って画像を変更しましたが、シュミレーターで試しても画像が挿し変わりませんでした。

**どのようなコードを書けば画像が挿し変わるでしょうか?
**
イメージとしては、SNSのいいねボタンのようなものです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ボタンタイプを変更してみてください。

とりあえず、書き方が違うんだけど、

swift

1let good = UIImage(systemName: "heart.fill") 2

用意されているプロパティを使って、

swift

1 2//ボタンの初期設定時にイメージを設定しておいて 3let good = UIImage(systemName: "heart") 4let good_selected UIImage(systemName: "heart.fill") 5btn.setImage(good, for: .normal) 6btn.setImage(good_selected, for: .selected) 7 8 9// タップされた際に 10 11@IBAction func iineButtonTapped(_ sender: UIButton) { 12 13 sender.isSelected.toggle() 14 15 16 17} 18

とかやるのがいいのかな。

投稿2020/03/22 02:46

編集2020/03/22 04:17
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dddd12233

2020/03/22 03:06

ボタン対応をSystemからCustomに変更してシュミレーターで試しましたが、押したらボタンが消えてしまいました。 このやり方では違いますか? リンク先も読みました。
退会済みユーザー

退会済みユーザー

2020/03/22 04:59 編集

いい加減なことを書いてしまったので、回答書き直したんですけど、 isSelectedを変えるだけだと、highlightedが間に挟まってチカチカするんでこれだけだと差し替えのほうが自然に見えますね。 細かい制御をしたくないなら、あんまりおすすめできないかなと思います。
guest

0

ベストアンサー

わざわざsetImageしなおさなくとも、stateを変えればよいのでは?

swift

1class ViewController: UIViewController { 2 @IBOutlet weak var iineButton: UIButton! 3 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 self.iineButton.setImage(UIImage(systemName: "heart"), for: .normal); 7 self.iineButton.setImage(UIImage(systemName: "heart.fill"), for: .selected) 8 } 9 10 @IBAction func iineButtonTapped(_ sender: UIButton) { 11 sender.isSelected = !sender.isSelected; 12 } 13}

投稿2020/03/22 04:17

thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/22 04:20

あ、フォローありがとうございます。
dddd12233

2020/03/22 04:37

みなさま、ご教唆ありがとうございます。 ひとまず let good = UIImage(named: "heart.fill") を let good = UIImage(systemName: "heart.fill") に変えたところ、[fix]が出たので直しました。 するとクラス宣言の直前に @available(iOS 13.0, *) という文言が追加されてエラーが消えました。 シュミレータで試したところ、ボタンの投下で画像が挿し変わりました。 このやり方でも問題ないのでしょうか? それともお二人のご教唆の通り、.isSelectedを使った方が良いのでしょうか?
thyda.eiqau

2020/03/22 04:42

if(@available(iOS 13.0, *)) { ... } は、アプリを動かそうとする端末 (iPhone, iPad, iPod touch) がiOS13.0以降のときのみ、 { ... } の中を実行する、という構文です。 UIImage(systemName:) はiOS13で追加された機能なので、iOS13未満の端末が UIImage(systemName:) に触れないように守ってくれています。 もビルド対象は13.0以降だけなのであれば、Deployment Targetを変更してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問