swift

swift(xcode)のtextViewの制約というかレイアウトについて




まさか1日に2つも記事を上げる羽目になるとは!!
しかしこれはもう公開したい!!

今日解決できたのは、またもや些細な問題
しかし私は今日1日これにハマって幾度となくふて寝しました!!

swiftのUITextViewの制約についてですよ

こいつ、なんか”縦横のサイズ”を指定しないと、こんな感じで
制約が決まらないんですよ

これ、「今月の目標」とか書いてあるlabelは制約決まってます。
そこからの高さの距離を指定して、横位置は中心の制約を設けております。

普通のUIなら、これで決まってます。
なのにコイツときたら「え?w全然キマってないっスよww」とか言ってきやがるんです。
ムカつく

解決方法を述べます。

インスペクタ(だっけ?)だか何だかの、とにかく右側のステータス表示欄にあるここ

scrolling Enabled

こいつのチェックを外すと制約が決まります!!

textViewって、中身をスクロールして見ることができるんですが
その機能をonにしてると、サイズを指定しなければならず・・・。

私はtextview内の文字が増えたら、縦が伸びるっていう仕様にしようと思いまして
その仕組みは結構その辺に転がっていたので難なく実装できたのですが
これ、縦横のサイズを指定すると、他のUIの制約がうまくいかない、というか
文字が増えて縦が伸びた時に、他のUIの位置が変わらず、結果真下にあるUIと被るという
最高にハイッ!なクソ不具合に陥りやがります。

因みに不具合の画像

正しい位置の画像

一応、textviewの高さを増し増し(一般的に”可変する”という)にする仕組みを。

一番上の方のclass ViewController: UIViewControllerに
UITextViewDelegateを追記します。

例;class ViewController: UIViewController, UITextViewDelegate {

んで次に、override func viewDidLoad() {の中に
高さを可変したいtextView.delegate = self

を書いて、以下をoverride func viewDidLoad()の上あたりに書くと多分幸せになれます。

func textViewDidChange(_ textView: UITextView) {
let maxHeight = 10000.0
if(textView.frame.size.height.native < maxHeight) {
let size:CGSize = textView.sizeThatFits(textView.frame.size)
textView.frame.size.height = size.height
}

}

上記が何をやっているかを知りたい時は、他の解説サイトを読んで勉強なさってね!
今日現在私はこれで幸せになれました。

それではみなさん、また明日とか!!




-swift