前提・実現したいこと
アプリを最初にインストールした際などに表示される「興味・関心のあるカテゴリー選択」の画面
試したこと
上記の画像のような「興味・関心のあるカテゴリー選択」の画面を作成したいのですが、どのように実装をすれば良いかわからないためご教示いただきたく思います
私が現時点で考えているのは、
- ボタン作成の内容を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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/26 08:00
回答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総合スコア64
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/26 09:17
2021/03/01 08:00 編集
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
総合スコア5086
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。