Sept 10, 2021, TIL (Today I Learned) - UITextField, UITextView TroubleShootings


学習内容


Truble 1:textViewはどうして消えたの?


この文章はテキストビューが死んでも画面に表示されないので、本質的な内容の大きさをよく探して、同じエラーが発生しないように記録してください.ちなみにintrinsiccontentsizeについて整理します:)
従来と同様にviewをコードとして以下のように記述した結果,商品名はtextViewに実装された.
商品詳細ページの商品名は一行とも書かれていません...次のコードが記述されています.
private let itemTitleTextView: UITextView = {
        let textView = UITextView()
        textView.adjustsFontForContentSizeCategory = true
        textView.font = UIFont.preferredFont(forTextStyle: .title3)
        textView.translatesAutoresizingMaskIntoConstraints = false
        textView.autocapitalizationType = .none
        textView.autocorrectionType = .no
        textView.isUserInteractionEnabled = false
        textView.setContentCompressionResistancePriority(.defaultLow, for: .vertical)

        return textView
    }()
textViewをスクリーン上に置いても商品名がスクリーン上にないことを確認しました...
いったい何の問題だ
まずはデバッグしてみましょうか?

商品登録日以上に存在するはずのtitle textViewはビューにまったく現れていないのではないでしょうか.そしてふと中身Sizeの問題だと思った

TroubleShooting 1: isScrollEnabled...


やっぱり開発者ならデバッグすれば検索なんですねハハ
@Rhyno開発者によると
TextViewはもっと複雑です.Scrolingが有効な場合、Interinsic Sizeは設定されません.スクロールが有効になっていない場合は、自動改行(改行)を考慮しないテキストサイズによって決まります.さらに、TextView自体に制約がある場合は、その制約を満たす直線上でコンテンツを移動するようにIntrisic sizeを調整できます.
[ソース]:2019-10-AutoLayoutストーリー(2)-Interinsic Content Size
ははは
textViewのisScrollEnabledはデフォルトでtrueに設定されています.だからintrinsicsizeを設定してstackViewに入れても見えません
この問題を解決するには、textViewにheightを指定するか、isScrollEnabledをfalseに設定する必要があります.
熟考した結果、商品名をスクロールするのはユーザーの立場で気まずいと思います.textView.isScrollEnabled = falseに設定し、問題を解決しました.
このまま!!

嬉しいApple Pencilがついに画面に出てきました!!

Trouble 2:textFieldレイアウトがおかしい


現在商品名textViewは普通に見えますまた別の問題が発生した.
今回TextFieldに問題が発生しました
割引Price TextFieldの配置がおかしいので何日か悩んでしまいました...

どうして.なぜ割引価格だけが遠くの画面中央に置かれているのでしょうか…165の真下に数字160を置きたいのですが、contenthugging、contentcompression、spacing powenview、stackView.触ったことのないものはない.なぜか分からないが、あれこれ触っているうちに、問題を解決する手がかりを見つけたようだ.

TroubleShooting 2:プレースホルダ、こいつ!



画面切り替え時に左下のフォントが見えますか?
このページは詳細ページとして機能し,右上隅のナビゲーションバーのボタンをクリックすることで,ユーザが自分でアップロードしたページを修正できることを想定している.
したがって、このページのすべてのテキストをtextFieldまたはtextViewとして実装し、ユーザーが「修正」ボタンをクリックすると、ページがすぐに「修正」モードに切り替わります.
しかし、修正モードでは、ユーザーがすべてのテキストを削除すると、どのテキストがテキストフィールドに入るか分からない可能性があります.このような状況を防ぐためにplaceholderに値を指定して、このような状況を防止します.
したがって、必要なテキストフィールドにプレースホルダ値を指定すると、上記のプレースホルダが一時的に表示される問題が発見されます.placeholderが上記のように見えると、ユーザーの立場ではアプリケーションに問題があると思われるので、ネットワーク作業に苦労する前に、hideView()メソッドを使用してplaceholderを持つtextFieldを非表示にしました.hideView()メソッドの適用が解除され、問題点が確認されました.
上のgifではよく見えないかもしれませんが、割引価格が表示されているtextFieldには(optional) 할인 가격という長いプレースホルダがあり、まず位置を占めています.だから私はプレースホルダの幅が先に指定されているのではないかと疑っています.そのため、ネットワークにはこの幅に合った数字が配置されます.
だからすぐ直しました!
private let itemDiscountedPriceTextField: UITextField = {
        textField.placeholder = "(optional) 할인 가격"
  
        return textField
    }()
まずこのように縮小します.
private let itemDiscountedPriceTextField: UITextField = {
        textField.placeholder = "할인"
  
        return textField
    }()
シミュレータで確認してみました!!

こつこつ!やっと私の希望通りにTextFieldが実現できました
したがって、私の推測によれば、textFieldの幅はまずプレースホルダによって実現され、textAlignmentは基本的に左揃えであるため、中央からtextFieldのテキストを作成するのではなく、左揃えから作成される.△もし間違っていたら、いつでも教えてください.直しますから.
また、placeholderを制御する専用の方法を作成して、修正ボタンをクリックしたときにplaceholderを適用する方法も考慮する必要があります.
いずれにしても、ここ数日煩わしいレイアウトの問題を解決できて嬉しいです.ある日、同じ間違いを繰り返さない開発者になるように努力すべきだと思います.私のトラブルシューティングが他の人に役立つことを願っています.ほほほ