質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

Q&A

解決済

2回答

21290閲覧

【iOS,Swift】要素の高さを取得する方法

Kesth

総合スコア83

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

0グッド

0クリップ

投稿2015/09/07 13:31

こんばんは。
Swift初心者の者です。

今回はUILabelやUIViewなどの高さを計算する(取得する)方法について
教えて頂きたいと思います。

例えば以下の様なコードがあったとして

Swift

1var label1 = UILabel() 2var view1 = UIView() 3 4//省略 5var label1Height = self.label1.layer.bounds.height 6var view1Height = self.view1.layer.bounds.height

で高さを取得できると思うのですが、特に高さが可変の
UILabelの場合、高さがうまく取得することができず、レイアウトが
崩れてしまいます。
ちなみに、下記の様なコードを書いています。

Swift

1var myLabel: UILabel = UILabel(frame: CGRectMake(0,0,120,0)) 2myLabel.text = "ユーザーの入力によって変化します" 3myLabel.numberOfLines = 0 4myLabel.sizeToFit() 5myLabel.lineBreakMode = NSLineBreakMode.ByCharWrapping 6self.view.addSubview(myLabel) 7 8var myLabelHeight = self.myLabelHeight.layer.bounds.height

最終的には、上記の myLabelを含んだ下記の様なレイアウトを考えており
myLabelの高さによって、myViewの高さも変わるようにしたいです。

Swift

1myView(UIview) 2 myLabel 3 myImage(高さ固定) 4

少々長くなりましたが、お聞きしたいことをまとめると

①要素の高さの取得方法について、基本的に冒頭で私が書いた
取得方法(layer.bounds.height)で正しいか?
②上記のような高さが動的に可変になるLabelのheightの取得方法
③その他Label以外の高さが可変になる要素のheightの取得法

以上3点についてご教授いただければと思います。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

①要素の高さの取得方法について

その方法でも同じ値が取れますがもっとシンプルにmyLabel.bounds.heightが良いと思います。

②上記のような高さが動的に可変になるLabelのheightの取得方法

sizeToFit()を最後に持ってくるといかがでしょう?
sizeToFit()で最適な大きさを計算した後にプロパティを変えてしまったので大きさが合わないのだと思います。
(なお、AutoLayoutを使っている場合はsizeToFit()効かない気がしましたのでその場合は別途教えてください。)

Swift

1var myLabel: UILabel = UILabel(frame: CGRectMake(0,0,120,0)) 2myLabel.text = "ユーザーの入力によって変化します" 3myLabel.numberOfLines = 0 4myLabel.lineBreakMode = NSLineBreakMode.ByCharWrapping 5myLabel.sizeToFit() 6 7println(myLabel.bounds.height)

③その他Label以外の高さが可変になる要素のheightの取得法

その他のViewも基本的には同じです。
今回のように中身が文字列の場合は特に気をつけなければいけない例だと思います。

投稿2015/09/13 14:49

jollyjoester

総合スコア1585

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

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

Kesth

2015/09/13 15:04

コメントありがとうございます! 大変わかりやすいです。 sizeToFit()を最後に実行するとのこと、試してみたいと思いますが、おっしゃるようにAutoLayoutを使用してしまっています。 その場合についてもご教授いただければ幸いです。 よろしくお願い申し上げます。
jollyjoester

2015/09/13 15:46

AutoLayoutを使っているのであれば高さを数値で取得してというやり方は難しいです。 実際のAutoLayoutの貼り方次第なのですが、例えば下記のURLにはnumber of lineを0にセットした上でheightの制約をxx以上とすることでUILabelの高さを可変にしているやり方が載っています。こうしてUILabelを可変にしてその外側のViewはUILabelの大きさに合わせて大きくなるように設定すれば自動でサイズが調整されると思います。 http://stackoverflow.com/a/18049684/4294279
fuzzball

2015/09/14 01:07

もう答えは出てしまっているのですが、ちょっと気になりましたので質問します。質問文ではUILabelをコードで生成していますが、実際にはAutolayoutで生成しているのでしょうか?それとも質問文の通りコードで生成しているのでしょうか?
Kesth

2015/09/14 05:33

@jollyjoesterさん なるほど、自分は基本的にどの要素でもAutolayoutを使用してしまっているのでなかなか調整が難しかったのかもしれません。また、参考URLですが、知らないやり方だったのでとても勉強になりました!ありがとうございます!
Kesth

2015/09/14 05:33

@fuzzballさん コメントありがとうございます。 自分が書いているLabelのコードですが、実際にはAutolayoutでwidthやHeightなどを指定して生成しています。紛らわしいサンプルを掲載してしまい、混乱させてしまい申し訳ないです!
guest

0

ビューの描画前を取得してるからおかしくなるんじゃないですか?
下記URLまだ試してないんですが、多分答えじゃないかと思います。
Is there a UIView resize event?

投稿2015/09/09 00:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Kesth

2015/09/11 05:57

コメントありがとうございます。 リンク先の方法を試しましたが、ちょっと上手く行かないようです。 もう少し試してみます!
退会済みユーザー

退会済みユーザー

2015/09/11 08:29

ためしに遅延実行させてみるのも手です。 それでうまくいくならそれはタイミングの問題です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問