5
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 3 years have passed since last update.

もっとみるを押したらUILabelが広がるやつ

Posted at

動作環境

  • Swift 5.2
  • Xcode 11.5

つくるやつ

こんな風にボタンを押したらUILabelが開閉するサンプルを作ります。開閉したいラベルの入ったUIStackViewと、閉じているときの高さを持ったUIViewの入ったUIStackViewを準備して、2つのUIStackViewの高さが同じになるような制約をつけておくことで、view.isHiddenの切り替えで開閉できるようになります。
文章はこちらから拝借しました。
sample1.gif

Storyboardのつくり方

Storyboardはこんな感じになります。
スクリーンショット 2020-06-12 23.28.44.png

手順

  1. 可変したいUILabelを準備してUIStackView(以下、TitleContainerViewと呼びます)に内包します。当然ですがnumberOfLinesは0に設定する必要があります。
    TitleContainerViewの設定は、Axis: VerticalAlignment: CenterDistribution: Fillとします。
    スクリーンショット 2020-06-13 2.28.09.png

  2. TitleContainerViewに対して基準となる位置の制約をつけます。
    スクリーンショット 2020-06-13 2.14.16.png スクリーンショット 2020-06-13 1.25.52.png

  3. もっと見るボタンを配置して、TitleContainerViewのbottomに紐付けます。こうすることで、TitleContainerViewが広がった時に一緒に下へ動くようになります。
    スクリーンショット 2020-06-13 2.16.16.png スクリーンショット 2020-06-13 1.18.39.png

  4. もう1つUIStackViewを準備して、中に空のUIViewを配置します。このUIStackViewの上下左右とTitleContainerViewの上下左右を一致させるように制約をつけます。
    スクリーンショット 2020-06-13 2.17.48.png スクリーンショット 2020-06-13 1.28.48.png

  5. 中に配置したUIViewにheightの制約をかけます。このheightが閉じている状態での高さになります。
    スクリーンショット 2020-06-13 2.22.44.png スクリーンショット 2020-06-13 2.23.00.png

これをViewControllerへ紐づけていきます。

ViewController

MoreReadViewController.swift
import UIKit

final class MoreReadViewController: UIViewController {
    @IBOutlet private var heightView: UIView!
    @IBAction private func moreReadButtonTapped(_ sender: UIButton) {
        UIView.animate(withDuration: 0.2) { [weak self] in
            guard let self = self else { return }
            self.heightView.isHidden.toggle()
        }
    }
}

動作確認に必要なコードだけ書いています。
UIStackViewの中のパーツをhiddenにすると、そのパーツが存在しないようにレイアウトが決定されます。
TitleContainerViewの高さはもう1つのUIStackViewの中にあるUIViewの高さによって決められているので、
UIViewhiddenになる -> 高さの制約がなくなる -> TitleContainerViewの高さはUILabelの高さによって決まる
という流れで開閉することができる、って感じだと思います。

こちらからクローンできます。

おまけ

最初に動かしたとき、こんな風なアニメーションになってしまい、かなり戸惑いました。
contentModeが何故かleftになっていたせいでした。デフォルトはtopになっているので気にする必要はないはずですが、、、
sample2.gif

5
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
5
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?