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

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

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

2回答

2013閲覧

「興味・関心のあるカテゴリー選択」画面の実装方法

mayo_

総合スコア2

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/02/26 03:55

編集2021/02/27 03:02

前提・実現したいこと

アプリを最初にインストールした際などに表示される「興味・関心のあるカテゴリー選択」の画面
イメージ説明

試したこと

上記の画像のような「興味・関心のあるカテゴリー選択」の画面を作成したいのですが、どのように実装をすれば良いかわからないためご教示いただきたく思います

私が現時点で考えているのは、

  • ボタン作成の内容をFor文で回しカテゴリーごとにうまく表示されるようにする

というものです

しかしながら、検索をしたところ上記の実装方法が見つからなかったため、おすすめのサイトや同様の質問、または私の考えている方法よりも良い方法がありましたら、案内していただけますと幸いです

解決・追記

Ranfordさんのコードを参考に実装したところ、無事に以下のように実装できました!
ありがとうございます

![イメージ説明]

加えてそれぞれのボタンに対しクリックされた際に色をつける動作をしたかったため、色々試行錯誤していたのですが、以下の記述で解決できました

Swift

1@objc func buttonEvent(_ sender: UIButton) { 2 if !sender.isSelected { 3 sender.backgroundColor = UIColor.gray 4 } else { 5 sender.backgroundColor = UIColor.clear 6 } 7 sender.isSelected.toggle() 8 }

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

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

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

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

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

tomato879241

2021/02/26 04:28

自分でUIImageViewとUILabelをUIViewに加えるしかないのではないでしょうか?
guest

回答2

0

ベストアンサー

swift

1// 要素配列 2let array = ["????動物","????コメディ","????スポーツ","????ゲーム","????動物動物","????コメディ","????スポーツ","????ゲームゲーム","????動物","????コメディコメディ","????スポーツスポーツ","????ゲーム"] 3// 改行の基準 4let maxWidth = CGFloat(300) 5// 隙間 6let offset = CGFloat(16) 7// 先頭か 8var lead = true 9// 初期位置 10var point = CGPoint(x: offset, y: offset) 11 12// UIViewController の viewDidLoad() とかで 13for (index, title) in array.enumerated() { 14 let button = UIButton(frame: CGRect.zero) 15 button.tag = index 16 button.setTitle(title, for: .normal) 17 button.setTitleColor(.black, for: .normal) 18 button.sizeToFit() 19 20 // 角丸枠 21 button.layer.cornerRadius = button.frame.height * 0.4 22 button.layer.borderColor = UIColor.black.cgColor 23 button.layer.borderWidth = 1.0; 24 25 // 先頭ではなく、配置しようとしているボタンが基準を超える場合は改行する 26 if lead == false, maxWidth < point.x + button.frame.width { 27 point.x = offset 28 point.y += button.frame.height + offset 29 } 30 button.frame.origin = point 31 32 // self = UIViewController 33 self.view.addSubview(button) 34 35 // 位置の更新 36 point.x += button.frame.width + offset 37 lead = maxWidth < point.x ? true : false 38 if lead { 39 point.x = offset 40 point.y += button.frame.height + offset 41 } 42} 43 44// 改行の基準の表示 45let view = UIView(frame: CGRect(x: maxWidth, y: 0, width: 1, height: point.y)) 46view.backgroundColor = .black 47self.view.addSubview(view)

投稿2021/02/26 07:47

編集2021/02/26 08:38
Ranford

総合スコア64

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

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

mayo_

2021/02/26 09:17

改行基準のコードも記載いただきありがとうございます! 無事に画像のようなボタンを配置することができました!ありがとうございます! 上記に加え大変お手数なのですが、追加でお聞きしたい事があります それぞれのボタンが押された時に該当のボタンのBackColorを変更したいのですが、どのボタンを押しても最後に生成されたボタンの色が変更されてしまいます 現状、以下のようにコードを書いています ----------------------- var buttonEv = UIButton() // viewDidLoad()より上で指定 〜 self.view.addSubview(button) buttonEv = button // ここに入れることでButton情報を渡せると思いきやできない // ボタンを押した時に実行 button.addTarget(self, action: #selector(buttonEvent(_:)), for: UIControl.Event.touchUpInside)   } // for文 } // viewDidLoad() // ボタンが押された時に呼ばれるメソッド @objc func buttonEvent(_ sender: UIButton) { buttonEv.backgroundColor = UIColor.gray } ----------------------- どのように改善を行えば良いかアドバイスいただけますと幸いです よろしくお願いいたします
Ranford

2021/03/01 08:00 編集

buttonEv は不要です。 最後に生成されたボタンが変更されてしまうのは、for文の中でボタンが毎回上書きするからです。 buttonEvent() の sender が押されたボタンなので、 「sender.backgroundColor = UIColor.gray」とすれば押されたボタンの背景色が変更されます。 しかし、これではON/OFFの切替がやりたくなってきます。 そこで、buttonEvent() では「sender.isSelected = !sender.isSelected」で選択状態を反転し代入します。 UIButtonの生成時にsetTitleColor()とsetBackgroundImage()を使用して「.normal」と「.selected」の設定を行なってください。 button.setTitleColor(.black, for: .normal) button.setTitleColor(.white, for: .selected) button.setBackgroundImage(UIImage(named: "通常時"), for: .normal) button.setBackgroundImage(UIImage(named: "選択時"), for: .selected) UIImage(named:)で使用する画像素材はAssets.xcassetsで追加します また、画像素材は sizeToFit() 後の button.frame.size にリサイズしてあげる必要が有ります。
guest

0

この目的であれば OSS を使った方が早いと思います(もちろん、スクラッチから作ることは否定しません)。

あまり高機能なライブラリではありませんが、それなりにこまめにメンテされているようです。

イメージ説明
もちろん、機種ごとの画面サイズにも考慮されています。

IBDesineble なので、StroyBoard を使って設定できますが、もちろんコードベースでも実装可能です。

ボタンを押されたときの処理は delegate になっているので、tagPressed(_:tagView:sender:) で処理すれば大丈夫です。

Swift

1import UIKit 2import TagListView 3 4class ViewController: UIViewController { 5 let tagListView = TagListView() 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup after loading the view. 10 11 view.addSubview(tagListView) 12 13 addTags() 14 tagListView.delegate = self 15 } 16 17 override func viewWillLayoutSubviews() { 18 super.viewWillLayoutSubviews() 19 20 tagListView.translatesAutoresizingMaskIntoConstraints = false 21 tagListView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true 22 tagListView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 12).isActive = true 23 tagListView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: 12).isActive = true 24 tagListView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true 25 } 26 27 private func addTags() { 28 let array = ["????動物", "????コメディ", "????スポーツ", "????ゲーム", "????動物動物", "????コメディ", "????スポーツ", 29 "????ゲームゲーム", "????動物", "????コメディコメディ", "????スポーツスポーツ", "????ゲーム"] 30 31 // フォントの選択 32 tagListView.textFont = .preferredFont(forTextStyle: .body) 33 // タグの配置方法 34 tagListView.alignment = .left 35 36 // タグ内部の上下左右に付ける余白(Inset) 37 tagListView.marginX = 9 38 tagListView.marginY = 12 39 40 // タグ間の Padding 41 tagListView.paddingY = 5 42 tagListView.paddingX = 7 43 44 // タグの背景色をテキスト色 45 tagListView.tagBackgroundColor = .white 46 tagListView.textColor = .black 47 48 // タグのボーダ幅と色 49 tagListView.borderWidth = 1 50 tagListView.borderColor = .lightGray 51 52 // タグに影を付ける 53 tagListView.shadowOpacity = 0.4 54 tagListView.shadowColor = UIColor.black 55 tagListView.shadowOffset = CGSize(width: 2, height: 2) 56 57 // タグの追加 58 tagListView.addTags(array) 59 60 // タグを角丸にする 61 // 基本決めうちだが、実際の高さを取得して決めるのであればこの方法しかないかもしれない 62 tagListView.cornerRadius = tagListView.tagViews.first!.frame.height / 2 63 } 64} 65 66extension ViewController: TagListViewDelegate { 67 func tagPressed(_ title: String, tagView: TagView, sender: TagListView) { 68 print("Tag pressed: (title), (sender), (tagView)") 69 // 一度全てのタグの背景を元の色に戻す 70 tagListView.tagBackgroundColor = .white 71 // 選択したタグだけ色を変える 72 tagView.tagBackgroundColor = .systemGray4 73 } 74}

投稿2021/02/26 23:40

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問