Auto Layoutで発生する黄色の警告

Auto Layoutで発生する黄色の警告は、自動修正機能がある。この自動修正機能は、エラーのあるソースコードに対するFixボタンのようなもの。以下は、この自動修正を行ったレポートである。なぜその警告が出るかはわからないのでひとまず置いといて、自動修正を行ったときの挙動を報告するものである。使用したXcodeのバージョンは9.0。

LeadingとTrailingに対するConstraint警告

Xcode9で既存のプロジェクトを開くとこんな警告が出ました。

Fixed leading and trailing constraints may cause clipping, one of them should have a constant ≥ standard space.

  • 選択肢1 : Use Fixed Leading and Resizing Trailing Constraints
    Adjust to include a fixed leading constraint and a trailing constraint with a constant ≥ standard space. Recommended if the view is on the left half of the parent view.
  • 選択肢2 : Use Resizing Leading and Fixed Trailing Constraints
    Adjust to include a leading constraint with a constant ≥ standard space and a fixed trailing constraint. Recommended if the view is on the right half of the parent view.

文を読んでも何を言っているかわからないので、簡単なプロジェクトを作ってテストしました。メインのviewの上にラベルを一つ置くものです。ラベルと親viewとの間にleadingとtrailingの制約を付けました(他の制約を述べるのは割愛)。この警告はleadingとtrailingのどちらかを26以上にすると発生しました。どちらかを26以上にしただけで両方の選択肢が出てきます。

発生させた状態です。左右の制約は100にしてあります。

上を選択

まずは上を選択してConfirmを押します。

左を固定して右を変動ですね。実行するとこうなりました。
左の制約は変わりませんが、右の制約が100固定から0以上になりました。文字の長さに応じて右が変化します。

その状態で文字を大量に入力するとこうなりました。
右が0まで行きました。

下を選択

次に下を選択してConfirmを押します。

左を変動させて右を固定ですね。実行するとこうなりました。
右の制約は変わりませんが、左の制約が100固定から0以上になりました。文字の長さに応じて左が変化します。

その状態で文字を大量に入力するとこうなりました。
見にくいですが、左が0まで行きました。

これは推測なのですがこの警告は、画面の端から制約を付けている場合に「その制約だとSafe Areaを考慮していないので内容がおかしくなるかもしれません」と言っている警告なのでは、と思います。ただ、25で出なくて26で出る理由がわかりません。
ラベルと関連付ける相手がSuper ViewかSafe Areaかによって、警告が付いたり消えたりすることがありました。警告が消えない場合はそこをチェックすると解決するかもしれません。

物体の幅に対するConstraint警告

また、別のところでこんな警告も出ました。

Fixed width constraints may cause clipping

  • 選択肢1 : Remove Constraint
    If there are appropriate leading and trailing Constraints, a fixed width may not be necessary
  • 選択肢2 : Set Constraint to ≥ Current Width
    This allows the label to extend in width with longer text while preserving the current layout
  • 選択肢3 : Set Constraint to ≥ Minimum Width
    Make sure the button does not shrink below the platform-recommended minimum for localizations that include short translations
選択肢2つのものはラベルに対して、選択肢3つのものはボタンに対して出ます。

これも簡単なプロジェクトを作ってテストしました。メインのviewの上にラベルとボタンを一つづつ置くものです。親viewとの間にleadingを50にする制約を付けました。trailingは付けていません。また、幅を100にする制約も付けました(他の制約を述べるのは割愛)。左側だけひっかかっていて右側は宙に浮いている状態です。左だけでもレイアウトは決定するはずなのに警告が出ます。

まずは、Remove Contsraintを実行します。幅の制約が削除されるのでこうなりました。

こんどは、Set Constraint to ≥Current Widthを実行しました。見にくいですが幅が100以上になっています。

最後に、Set Constraint to ≥ Minimam Widthをじっこうしました。これはボタンにだけ出てきた項目なので、ボタンにだけ実行してます。ラベルはそのままです。幅が44以上になりました。この44はこの時点で書かれている文字から決定するようです。
実行後にボタンの文字を変えてみたのですが、制約は44のままでした。

とりあえず現象の報告でした。

コメント

このブログの人気の投稿

Swiftのコンパイルエラー寄せ集め

コンパイルエラー覚え書き(Objective-C)

AVAudioSession細かいことまとめ(late 2014)