🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

1回答

446閲覧

ButtonをタップするとimageViewの画像が消えてしまう

swifty

総合スコア38

Xcode

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

Swift

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

0グッド

0クリップ

投稿2019/11/05 08:26

実現したいこと

ProfileButtonのimageViewにKingfisherというライブラリを利用して画像URLを渡して画像を表示しています。問題なく表示されるのですが、1度buttonをtapしてしまうとButton内の画像(imageView)が消えてしまいます。それを消えないようにしたいです。

ソースコード①ボタンクラス

swift

1import Foundation 2import UIKit 3import Kingfisher 4 5class ProfileButton: UIButton { 6 7 private let profileButtonSize = CGSize(width: 32, height: 32) 8 9 override init(frame: CGRect) { 10 super.init(frame: frame) 11 12 DispatchQueue.main.async { 13 self.imageView!.isHidden = false 14 } 15 16 imageView!.frame = CGRect(origin: CGPoint.zero, size: profileButtonSize) 17 imageView!.clipsToBounds = true 18 imageView!.contentMode = .scaleAspectFill 19 imageView!.layer.cornerRadius = profileButtonSize.width / 2 20 } 21 22 required init?(coder: NSCoder) { 23 fatalError("init(coder:) has not been implemented") 24 } 25 26 var profileImageUrl: String? { 27 didSet { 28 29 let scale = UIScreen.main.scale 30 let imageSize = CGSize(width: profileButtonSize.width * scale, height: profileButtonSize.height * scale) 31 let resizingProcessor = ResizingImageProcessor(referenceSize: imageSize) 32 let options = [KingfisherOptionsInfoItem.processor(resizingProcessor)] 33 self.imageView!.setImage(urlString: profileImageUrl!, placeholder: #imageLiteral(resourceName: "ic_header_profile"), options: options) 34 } 35 } 36}

ソースコード②呼び出し元viewController

swift

1//プロフィールアイコンボタンをセットする 2let profileButton = ProfileButton() 3profileButton.profileImageUrl = UserDefaults.Channel!.urlImage 4profileButton.isUserInteractionEnabled = true 5profileButton.addTarget(self, action: #selector(tapOnMenu(_:)), for: .touchUpInside) 6let menuItem = UIBarButtonItem(customView: profileButton) 7navigationItem.leftBarButtonItem = menuItem 8 9navigationItem.title = Localizable.DashboardScreen.titleDashboardScreen.localized() 10if let containerVC = AppDelegate.share()?.getContainerViewController() { 11 self.containerView.panGestureRecognizer.require(toFail: containerVC.edgePanGestureRecognizer) 12} 13 14UserDefaults.standard.rx 15 .observe(Channel.self, UserDefaults.keySaveChannel) 16 .observeOn(MainScheduler.instance) 17 .subscribe(onNext: { [weak self] _ in 18 guard let `self` = self, UserDefaults.Channel != nil else { 19 return 20 } 21 22 //プロフィールアイコンボタンをセットする 23 let profileButton = ProfileButton() 24 profileButton.profileImageUrl = UserDefaults.Channel!.urlImage 25 26 profileButton.isUserInteractionEnabled = true 27 profileButton.addTarget(self, action: #selector(self.tapOnMenu(_:)), for: .touchUpInside) 28 29 let menuItem = UIBarButtonItem(customView: profileButton) 30 self.navigationItem.leftBarButtonItem = menuItem 31 32 }).disposed(by: disposeBag)

試したこと

元々画像が表示されず困っていたのですが以下のコードをProfileButtonクラスに挿入したことで画像が表示されるようになりました。ですがボタンをタップしてしまうと画像が表示されなくなってしまうので、これと同じでスレッド関連の何かが影響しているのではないかと思いいろいろと試行錯誤してみましたが解決することができかねている状況です。皆様のお力添えいただけますと幸いです。

DispatchQueue.main.async { self.imageView!.isHidden = false }

補足情報

Swift 5.0.1
Xcode 11.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

kingfisherは使ったことはありませんが、
以下の記事を見た感じでは
http://www.cl9.info/entry/2016/12/26/231642

UIButtonのimageViewに対してではなく、UIButtonそのものに対してkingfisherによる画像設定APIが用意されているはずなので、そちらを使ってください。

一般的にUIButtonに画像をセットする場合も直接imageView.imageへ画像を入れることはありません。

UIButtonはタップ時や無効時など、状態に併せて画像を切り替える機構がありますので、
直接imageViewへ画像を入れてもUIButton側で勝手に画像を差し替えられます。

投稿2019/11/06 01:48

takabosoft

総合スコア8356

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

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

swifty

2019/11/06 10:26

UIButtonそのものに直接セットすることで無事解決できました!本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問