23
18

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.

sizeToFitを使わずにUILabelの文字を上揃え(上寄せ)にする

Last updated at Posted at 2019-06-02

概要

iOS開発を行っていると、文字の並びを上揃え(上寄せ)にしたいときがあると思います。
例えば、以下のような時です。
ダウンロード.gif
上図のような、UICollectionViewを用いてセルが横並びになっている画面を作りました。この各セルにはUILabelがあり、そのUILabelは最大2行分の高さになるとします。
普通に実装すると、文字の1番上の位置はバラバラになると思います。

これを調整しようとUILabelのプロパティを調べてみると、左揃えや中央揃えはありますが上揃えがないことに気が付きます。
正直不親切だと思います。(Appleさんプロパティ追加して、、、)
ですので、以下でこの問題への対処法を書いていきます。

原因

原因はUILabelの文字の高さの位置が、必ずUILabelの高さの中央に来るように補正されることです。
文字が全部で1行のときはその1行がUILabelの中央に、2行のときは上の行と下の行の隙間がUILabelの中央に補正される、というわけですね。
label2.jpg
ですので文字を上揃えにするためには、UILabelの高さから調整する必要があります。

やり方1: sizeToFit()

UILabelのメソッドの一つにsizeToFit()というものがあります。これは呼ぶとUILabelの幅と高さが、文字がピッタリ収まる大きさに調整されます。
これを用いてUILabelの高さを調整し、その後でUILabelを上揃えにすれば文字も上揃えになります。

sampleCell.swift
func setupLabelFrame() {
    var fixedFrame = self.label.frame
    self.label.sizeToFit()
    fixedFrame.size.height = self.label.frame.size.height
    self.label.frame = fixedFrame
}

ただしこのやり方では、文字の中身が動的に変わる場合はその都度高さと位置の調整が必要になります。
#やり方2: AutoLayout + numberOfLines = 0
私がよく利用する方法がこちらです。
sizeToFitのように都度調整する必要がなく、原理的にもわかりやすいのでおすすめです。

  1. UILabelにAutoLayoutを用いて、左辺と右辺と上辺のConstraintを追加する
  2. UILabelのnumberOfLinesを0にする

プロパティ.jpg
3. いったん最大行数分の高さをで表示し、その高さがUILabelの高さの最大値となるようにConstraintを追加する

スクリーンショット 2019-06-02 23.51.38.jpg

これで文字が上揃えになります。

原理を説明すると、1でUILabelの伸びていく方向を下方向に限定して、2で文字の量によって高さを自動調節されるようにして、3でその伸び幅の最大値を決めるって感じですね。
これによってUILabelの大きさが文字によって自動的に決まってくれるようになります。
ダウンロード (1).gif

終わりに

正直、こんな回りくどい実装しなくてもUILabelのプロパティに上揃えを用意してくれれば解決なのですが、、、
しかし需要がありそうなのに実装されないのは何かしら理由があるのでしょう。
いずれにしろiOS開発にはコツがいるなと感じる今日この頃です。。。

23
18
1

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
23
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?