🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

1回答

1286閲覧

swift sizToFit()メソッド

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2021/02/14 10:26

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 var colorView = UIView() 6 var colorArray:[UIColor] = [.red,.orange,.yellow,.green,.cyan,.blue,.purple,.magenta] 7 var colorIndex = 0 8 var textView = UITextView() 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 // Do any additional setup after loading the view. 13 14 colorView.frame = CGRect(x: 0, y: 0, width: self.view.bounds.width / 4, height: self.view.bounds.width / 4) 15 colorView.center = CGPoint(x: self.view.bounds.width / 2, y: self.view.bounds.width / 2) 16 colorView.backgroundColor = colorArray[colorIndex] 17 self.view.addSubview(colorView) 18 19 textView.text = "0" 20 textView.textColor = .black 21 textView.backgroundColor = .lightGray 22 textView.textAlignment = .center 23 textView.sizeToFit() 24 textView.frame = CGRect(x: 0, y: 0, width: self.colorView.bounds.width, height:self.textView.bounds.height) 25 textView.center = self.colorView.center 26 self.view.addSubview(textView) 27 } 28}


なぜtextViewにsizToFit()メソッドを追加することでこの灰色の高さのようになるのでしょうか?textViewの高さ自体はself.textView.bounds.heightこのように指定指定しています。textViewがこの高さになるのがよくわかりません。

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

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

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

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

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

guest

回答1

0

sizeToFit() メソッドは、コンテンツの内容に応じたサイズに呼び出した View のサイズ(マニュアルでは receiver view という書き方をしています)を変更します。

なので、sizeToFit()を呼び出だすと、その時点で textView.text に代入されていた文字列 "0" の幅、高さに応じたサイズが自動的に設定されます。

したがって、次のように記述した場合、コメント通りの設定になります。

Swift

1 // この時点では frame size は (0.0, 0.0, 0.0, 0.0) 2 textView.text = "0" 3 // sizeToFit() を実行することで、frame size は (0.0, 0.0, 17.0, 30.0) となる 4 textView.sizeToFit() 5 // frame size を直接変更している。 6 // 幅は colorView.bounds.width なので colorView の幅と同じ 7 // 高さは textView.bounds.height なので、sizeToFit() で決定された 30 が適用 8 textView.frame = CGRect(x: 0, y: 0, width: self.colorView.bounds.width, height:self.textView.bounds.height)

textViewがこの高さになるのがよくわかりません。

ご自身のご質問

で、tsuki01さんが丁寧に解説されていますので、今一度ご確認いただけますでしょうか。

高さが「30」になるのは、UITextView に設定されているフォントの種類やサイズから、自動的に計算されるためでです。

フォントの種類やサイズから、Apple が「高さ30が適切だ」と計算した以上の理由はないと思います。

別の言い方をすれば、その時点で設定しているフォントの種類やサイズから計算した UITextView のサイズは「高さ30が美しい」と Apple が決めた。それだけだと思います。


流れがよくわからない時には、原始的ですがprint()などを使って値を追ってみるのが一番簡単で確実です。

Swift

1 print("before sizeToFit:", textView.frame) 2 3 textView.sizeToFit() 4 print("before changing frame:", textView.frame) 5 6 textView.frame = CGRect(x: 0, y: 0, width: self.colorView.bounds.width, height:self.textView.bounds.height) 7 print("after sizeToFit:", textView.frame)

と言った感じで、逐一 UITextView のframe(あるいはbound)の変化を観察するのも一つだと思います。


これでもしっくりこない、ということであれば、具体的にフォントのサイズを変更しながら実験するのも一つの手です。

Swift

1 textView.font = .systemFont(ofSize: 30) 2 print("before sizeToFit:", textView.frame) 3 4 textView.sizeToFit() 5 print("before changing frame:", textView.frame) 6 7 textView.frame = CGRect(x: 0, y: 0, width: self.colorView.bounds.width, height:self.textView.bounds.height) 8 print("after sizeToFit:", textView.frame)

のように、フォントのサイズを 「30ポイント」とか、「40ポイント」などに変更し、値がどのように変わるか確かめてみるのも一つの手です。

ちなみに、「ポイント」と「ピクセル」とは単位系が違いますので、「30ポイント」を指定したから、高さが「30ピクセル」にはなりませんので、そこは十分にご注意ください。

投稿2021/02/19 04:59

TsukubaDepot

総合スコア5086

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問