今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

AutoLayout自適応ラベルに関する問題

最近のプロジェクトで、自適応 label を作成しているときに、いつも問題が発生します:#

image1

image2

これには本当に悩まされており、6 と 6p でのみ発生します。最初は自適応の方法が間違っていると思いましたが、何度も書き直した後、間違っていないことに気付きました。。。。
問題はどこにあるのか、ずっと見つけられません。

  1. 今日、グループで自適応 label のコードを投稿している友達を見かけ、質問したところ、このVerticallyAlignedLabelを見つけました。そして、やっと解決できると思い、試してみた結果、確かに上に揃いましたが、余分な部分はまだ残っていました;
  2. では、問題はどこにあるのでしょうか?それで、探し続けて、Multiline UILabel height with Autolayout higher in landscapeという Stack Overflow の問題を見つけました。以前はずっと中国語で検索していましたが、英語に変えたところ、ようやく似たような問題が見つかりました。私だけではないはずだと思いました(こんなに愚か😢)。そして、objc.io でもIntrinsic Content Size of Multi-Line Textがあり、彼らの方法に従って修正することにしました;
  3. くそ、彼らの方法を直接使うことができませんでした。なぜなら、私は view を取り出してしまったからで、しかも tableViewcell の label 上にあるのです。後で賢い私は、幅の問題だからだと思いました。super の frame に合わせて自動的に変わることができず、正しい値を直接計算してここに置くこともできませんでした。やっぱり自分を褒めたいです。そして、実行してみると...
  4. なんてこった、まだダメでした。もう楽しく遊べないのか、死にたくなります。

image3

  1. その時、ふと気づきました。label に値を設定する下に、label の間隔を増やすコードを追加していました。それをコメントアウトして試してみると... うん、成功しました。興奮しないで、6p でも試してみると、結果... 本当に成功しました。この瞬間の私。

  2. まだ最後の一歩が足りません。こんなに多くの変更を加えたのに、結局どこが効果を発揮したのでしょうか?それとも一緒に効果を発揮したのか?そして、最初のカスタム label を削除すると、うん、問題は出ませんでした。そして、frame の計算を削除すると、くそ、これは重要な文でした。そして、その後は何もありませんでした。午後の時間を費やして、たった二つのことをしました:a. 一文を追加した;b. 一文を削除した。

これは最初のコードです:#

image5

これは最後のものです#

image6

まとめ#

実際、この原因は早くに調べるべきでした。なぜなら、この問題は iPhone6/iPhone6p でのみ発生し、ここでの判断はちょうど 5s の画面幅より広い電話に対して行われているからです。しかし、私はずっとこの方向で考えていませんでした。Ps(もし計算した高さが多すぎる問題が発生した場合、2 で示されたリンクの方法を直接試してみてください;もし高さが少ない場合は、0.1 を加え忘れていないか確認してください)。

また、私は確かに一文を追加し忘れていました。それは label の幅を設定するもので、私の view が controller に追加されるのは viewDidLoad の中で、その時点では自動レイアウトがまだ終了していなかったからです。***(Ps: 通常、frame を設定するのは viewDidLayOutSubviews の中で行うべきです)** しかし、私は一般的に viewDidLoad の中で作成し、作成時に直接 frame を設定するので、ついに苦い果実を味わうことになりました。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。