2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FlexLayoutを使用してタグ一覧画面を実装してみる

Last updated at Posted at 2019-01-27

#はじめに

タグリスト?どうやって作ろう?
イメージは以下スクショのようなものでどう実装しようか調べた際にFlexLayoutを見つけ実際に使ってみて簡単に実装できたので実装方法についてまとめてみました!

IMG_9963.jpg (最近自分の調理周りを改善に力を貸してくれたアプリのTag画面から引用させていただきましたmm)

FlexLayoutの特徴

AutoLayout,UIStackViewと比べるとハイパフォーマンス

スクリーンショット 2019-01-27 17.55.46.png

直感的に書ける
一度CSSのFlexboxを触れたことはあったのも恩恵としてあったと思いますが、
どう表現したいのか(横に追加する感じで並べたい?下に追加する感じで並べたい?)が直感的にできた。
またチェインで書けるのも直感的、気持ち良さの観点から良かったです!

FlexboxとFlexLayoutでの対応表があるのも助かりました!
スクリーンショット 2019-01-27 22.08.00.png

CSS FlexBoxのチートシート

FlexLayoutのリポジトリはこちら

タグリストを実装していく

イメージ

タグリストの特徴
・横に並べていく
・画面に収まらない場合は折り返す
IMG_9963.png

Tagを表示するUIViewを配置する

Tagを表示する範囲を指定するためのUIViewを用意します。(以後このUIViewをContainerと呼びます)
以下スクショでは範囲をわかりやすくするためにContainerの背景を黄緑色にしてます。
スクリーンショット 2019-01-27 21.54.52.png

Storyboardで配置したTag表示用のContainerをViewControllerに紐づける
スクリーンショット 2019-01-27 22.04.33.png

イメージ通りにTagを表示するロジック部分

タグリストの特徴
・横に並べていく
・Tag表示用のUIViewからはみ出る場合は折り返す
IMG_9963.png

・横に並べていく
directionにrowを指定してあげると良さそう
スクリーンショット 2019-01-27 22.12.14.png

・Tag表示用Containerからはみ出る場合は折り返す
wrapを指定してあげると良さそう
スクリーンショット 2019-01-27 22.12.58.png

・横に並べていく -> direction(.row)
・Tag表示用のUIViewからはみ出る場合は折り返す -> wrap(.wrap)

コードに起こしてみる


    private func setupTags(_ tags: [String]) {
        self.tagContainerView.flex.direction(.row).padding(8).wrap(.wrap).define { flex in
            tags.forEach {
                let tagLabel = UILabel()
                tagLabel.text = "#\($0)"
                tagLabel.backgroundColor = UIColor.white
                tagLabel.layer.borderWidth = 1.0
                tagLabel.layer.cornerRadius = 4
                // タグ間隔のマージン指定
                flex.addItem(tagLabel).margin(8)
            }
        }
    }

Tag表示用のContainerの高さ設定

Containerの高さはTagの数とTagの文字列の長さに影響されるので高さを自動で決めるように設定する


    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        self.updateFlexLayout()
    }
    
    private func updateFlexLayout() {
        self.tagContainerView.flex.layout(mode: .adjustHeight)
    }

Tagを表示させてみる

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupTags([
            "噂の人気商品",
            "発売までもう少し",
            "インスタ栄え",
            "SSS",
            "地味に知られてない",
            "トレンド商品",
            "とりあえず最前線"
        ])
    }

こんな感じになりました

スクリーンショット 2019-01-27 22.29.35.png

Containerの高さを自動で調整するよう設定しているので高さもほど良い!
わかりやすく背景を黄緑にしてみました!

self.tagContainerView.flex.layout(mode: .adjustHeight)
スクリーンショット 2019-01-27 22.30.35.png

#おまけ

良く使うアプリでこれもFlexLayoutでいけるんじゃないか?と思い簡易的に試してみた。
とりあえずdirectionをcolumnにしたらそれっぽくなるやろえい!
Image_from_iOS.png

    private func updateFlexLayout() {
        self.tagContainerView.flex.layout(mode: .adjustHeight)
    }

    private func setupTags(_ tags: [String]) {
        self.tagContainerView.flex.direction(.column).define { flex in
            tags.forEach {
                let tagLabel = UILabel()
                tagLabel.text = "\($0)"
                tagLabel.backgroundColor = UIColor.white
                tagLabel.layer.borderWidth = 1.0
                tagLabel.layer.cornerRadius = 4
                flex.addItem(tagLabel).margin(8)
            }
        }
    }
スクリーンショット 2019-01-27 22.46.21.png

#さいごに

どうだったでしょうか?
今までなんとなく目にしてきたタグリストって意外と簡単にできそうだなって思いませんか?

今回のはデザインをしっかり当てているわけではないのでlet tagLabel = UILabel()な部分を独自のCustomViewTagLabel()とか定義してあげると見栄えも良くなるかと思います!

FlexLayoutのREADMEが丁寧!ありがとうございます!!!

投稿して改めて気づいたQiitaさんもしっかりtag一覧ありましたね!mm
多分これはdirection(.row),wrap(.wrap)パターンだ!
            ↓
スクリーンショット 2019-01-27 23.04.11.png

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?