イラストレーターみやびの漫画館 作品集 - 月の高いところのロゴマーク

今日のプリン言

謎のプリン語る。
一人書く人増えました。

【Swift4】UITextFieldの高さを変更

2018年04月12日

みやびプリン 140 87

500 320

【Swift4】UITextFieldの高さを変更 - サムネイル

どうも、ついに車買いましたー!
フィットのRSです。
車のことはよくわからないですが、
いい車とのことです。
(宝の持ち腐れか)

さて、そんな自慢話はよくて、表記の件。

調べてみればわかるが、これ、実はかなり難しい。
ストーリーボードで置いた物の高さを変えるのは特に難しい。
調べてだいたい見つかるのは下記のエントリーのような方法。

ランキング画面の作成、UITextFieldの高さを変更

いや、角丸つけたまんまにしたいんだから。
しかも、やっても効かんし。

さらに調べて、こんなエントリーにたどり着いたが・・・。

UITextFieldに余白(パディング、マージン)を持たせる【正攻法】

これはかなり確信に近づいた。
実際、最初調べてたのは余白の付け方だし、
余白つけるのはうまくいった。

しかし、高さを調整するにはいたらず・・・。

そこで、発想を転換して調べることにした。
UIViewの生成サイクルの中でなんかすればいいのでは?
と調べてみたのだ。
(UITextField含め、多くのView系クラスは、UIViewがスーパークラスなので)

そして、見つけたのが、下記記事。

UIKitのView表示ライフサイクルを理解する

これを参考に、レイアウトを決めるメソッドの前に、実行してみた。
すると、うまく動いたではないか!

余白の変更と併せたものが下記。

import UIKit

class CustomTextField: UITextField {
  
  //入力したテキストの余白
  override func textRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: 20, dy: 0)
  }
  
  //編集中のテキストの余白
  override func editingRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: 20, dy: 0.0)
  }
  
  //プレースホルダーの余白
  override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
    return bounds.insetBy(dx: 20, dy: 0.0)
  }
  
  // 高さを高くするために実行(デフォ値は、フォントサイズによって変動)
  override func layoutSubviews() {
    self.frame = CGRect(x: self.frame.origin.x, y: self.frame.origin.y, width: self.frame.size.width, height: 50)
    super.layoutSubviews()
  } 
}

つまり、layoutSubviewsが実行される前に、親View(自身)の大きさを変えてしまえばいいのだ。
あとは、ストーリーボード上のテキストフィールドに、このカスタムクラスを適用すればいい。
これ、おそらく、テキストの量によって高さを変動なんてもできるはず。

というか、これを使えば、オートレイアウトも、デフォルト値もなんも怖くない。
なんせ、レイアウトする前に全て終わらせてしまえばいいのだから・・・。
(↑暗殺者みたいなセリフやな←中二)

これはきたかもしれないですね。

トラックバック(0)

トラックバックURL:

コメントする