2017-10-26 14 views
0

自動レイアウトとスタックビューで何かを達成しようとしています。私は、下に示すように、UIView、UITextView、およびUIViewを持つ垂直Stackviewを持っています。スクロールを有効にしてスタックビュー内でUITextViewを展開する

enter image description here

私はここで、前の答えをチェックアウトしたが、これを達成するためのクリーンな解決策を見つけることができませんでした。

UITextViewは編集可能であり、ユーザーが入力すると展開する必要があります。このため、IBのUITextViewのスクロールを無効にしました。私はまた、UITextViewで設定された高さの制約が "より大きいか等しい" 10に設定され、行数が0に設定されているため、ユーザーが入力する間に実行時に内在する高さが使用されます。 UIStackViewの下端がキーパッドのアクセサリの上端に達するまで、UITextViewの展開を続行したい。私はいくぶん私のスタックビューは、Superviewの上端、後端、および前縁に固定されたUITextViewの部分を拡張することができましたが、私はそれを理解することができるstackview needs Y position or heightというエラーが発生し続けますが、 UITextViewは単に展開されません。

キーボードアクセサリビューの上端に達したときにUITextViewの展開を停止する方法もわかりません。

私はこれまで

let allowedHeight = self.view.frame.height - (self.keyboardHeight! + self.accessory.frame.height) 

基本的にkeyboardheight +アクセサリビューの高さを減算することによってビューフレームに許容高さを見つけるされたコード。この計算は正しく行われます。次に、UITextViewのスクロールを有効/無効にするだけで動作することを期待して、これを実行します(textViewDidChange)。しかし、テキスト全体の表示がすべてのキーストロークで奇妙に上下にジャンプするので、明らかにしません。

func textViewDidChange(_ textView: UITextView) { 
    if stackView.frame.height >= allowedHeight{ 
      textView.isScrollEnabled = true 
     } 

    if stackView.frame.height < allowedHeight{ 
      textView.isScrollEnabled = false 
     } 
} 

私が探しているものを達成する最良の方法は何ですか?

答えて

1

カップルノート...

私はあなたがあなたのUITextViewのではなく、あなたのUIStackViewの最大高さを設定したほうが良いと思います。テキストビューは内容に基づいて拡大/縮小されるので、<=の高さの制約を設定できます。

"elementsHeight" - トップビューとボトムビューで使用される垂直サイズと任意のスペーシング - を計算し、ビューの高さからelementsHeightを引いた値に "最大テキストビューの高さ"を設定します。

"max text view height"が変更されたときに、テキストビューの高さ制約定数を更新します。

次に、テキストビューの.contentSize ...に対してオブザーバーを設定し、.contentSize.heightに基づくスクロールを「最大テキストビューの高さ」と比較して有効/無効にします。

サブビューがレイアウトされているときにサイズを更新し、再帰ループにならないようにするために、フープジャンプのビットが必要です。

これは私がそれを設定する方法である:テキストビューの初期の高さの制約が<= 40ある

enter image description here

- それは、コードを経由するたびに変更されるように、それは本当に、重要ではありません。ビューのレイアウトが異なっています。

私はGitHubに例を挙げました - それはうまく動作しますが、実際には単なる出発点です。あなたが興味を持っているかどうか見て、それを選んでください。 https://github.com/DonMag/ExpandingTextView

+0

ありがとう、ありがとうコードです。私はこれを試してみましょう。 – Annjawn

+0

これは完璧に動作しています。 iPhone Xの1つの注意点iPhone Xの安全領域は何らかの理由でデフォルトでyオフセットに22ポイントを追加するので、スタックビューのyオフセットを追加するだけで、キーボードの背後にあるすべてのものが22ピクセルだけ押し下げられていました。世界の終わりではなく、容易に修正可能です。ありがとうございました! – Annjawn

関連する問題