web-dev-qa-db-ja.com

自動優先最大レイアウト幅は、8.0より前のiOSバージョンでは使用できません。

私はXcode 6 beta 6で既存のiOSプロジェクトを開きました、そしてXcodeはストーリーボードとXibファイルの両方のために以下の警告をリストします:

自動優先最大レイアウト幅は、8.0より前のiOSバージョンでは使用できません。

以下のように幅を明示的に設定して、警告に対処してみました。

それでも、これで警告は解決されませんでした。どうやってそれらを削除することができますか?

321
mono

更新3:
この警告は、デプロイメントターゲットが7.1に設定されている場合にnumberOfLinesが1以外の値に設定されているラベルによっても引き起こされる可能性があります。これは新しいシングルビュープロジェクトでも完全に再現可能です。

再現する手順:

  1. 新しいシングルビュー、客観的cプロジェクトを作成する
  2. 展開ターゲットを7.1に設定します。
  3. プロジェクトのストーリーボードを開く
  4. 提供されたView Controllerにラベルをドロップします
  5. そのラベルのnumberOfLinesを2に設定します。
  6. コンパイル

私は次のレーダーを提出しました:
rdar:// problem/18700567

アップデート2:
残念ながら、これはXcode 6のリリース版でも同じことです。ほとんどの場合、ストーリーボード/ xibを手動で編集して問題を解決することができます。下記のコメントの Charles A. によると:

それはあなたがこの警告を偶然にも簡単に紹介することができることを言及する価値があります、そして警告それ自体は犯人であるラベルを見つけるのを助けません。これは複雑な絵コンテでは残念です。ストーリーボードをソースファイルとして開き、regex<label(?!.*preferredMaxLayoutWidth)で検索して、preferredMaxLayoutWidth属性/値を省略したラベルを見つけることができます。そのような行にpreferredMaxLayoutWidth = "0"を追加した場合、それは明示的とマークして値0を設定することと同じです。

更新1:
このバグはXcode 6 GMで修正されました。

元の回答
これはXcode6-Beta6とXCode6-Beta7のバグなので、今のところ無視してかまいません。

Apple DeveloperフォーラムのAppleエンジニアは、バグについて言うために this を持っていました:

推奨最大レイアウト幅は、UILabelの自動レイアウトプロパティで、コンテンツに合わせて自動的に垂直方向に拡大することができます。 6.0より前のバージョンのXcodeでは、デザイン時に複数行ラベルのpreferredMaxLayoutWidthを現在の境界サイズに設定していました。水平レイアウトが変更された場合は、実行時にpreferredMaxLayoutWidthを手動で更新する必要があります。

iOS 8では、実行時にpreferredMaxLayoutWidthを自動的に計算する機能が追加されたため、複数行のラベルを簡単に作成できます。この設定はiOS 7との後方互換性はありません。iOS 7とiOS 8の両方をサポートするために、Xcode 6ではサイズインスペクタのpreferredMaxLayoutWidthに "Automatic"または "Explicit"を選択できます。あなたがすべき:

最高のエクスペリエンスを得るためにiOS 8をターゲットにしている場合は「自動」を選択してください。 <iOS 8をターゲットにしている場合は "Explicit"を選択します。設定したいpreferredMaxLayoutWidthの値を入力できます。 [明示的]を有効にすると、チェックボックスをオンにした時点の現在の境界サイズがデフォルトになります。

(1)自動レイアウトを使用している、(2)複数行ラベルに「自動」が設定されている場合(ラベルのサイズインスペクタで確認できます)、(3)デプロイ先が<iOSの場合8。

この警告は自動レイアウト以外のドキュメントに表示されることがバグのようです。この警告が表示され、自動レイアウトを使用していない場合は、警告を無視してもかまいません。

あるいは、問題のストーリーボードまたはxibのファイルインスペクタを使用して「Builds for」を「Builds for iOS 8.0 and later」に変更することで問題を回避することもできます。 Xcode file inspector

373
memmons

大きなストーリーボードで問題のラベルを見つけるには、以下の手順に従ってください。

  1. XCodeのIssue Navigatorで、エラーを右クリックして[Reveal In Log]を選択します。 (注:@SamはxCodeの レポートナビゲータ を見てください。また@Riveraは、コメントの中で「Xcode 6.1.1以降、警告をクリックすると自動的に競合するラベルが開き、強調表示されるようになります。これをテストしないでください)。

enter image description here

  1. これにより、ストーリーボードファイルの最後にエラーが表示されます。 .storyboardの後に値をコピーします

enter image description here

  1. 次に、ストーリーボードをソースファイルとして公開します。 enter image description here

  2. サーチ。内容を見れば、ここからラベルのラベルを簡単に判断できます。 enter image description here

ラベルが見つかったら、私にとってうまくいった解決策は "preferred width"を0に設定することでした。

enter image description here

ところで、あなたはいつでもすぐにアイテムを選択して識別インスペクターの下を見ることによってインターフェースアイテムのidを取得することができます。とても便利な。

enter image description here

315
smileBot

あなたはこの問題を修正することができますソースとしてストーリーボードを開かずに。 numberOfLines!= 1でデプロイメントターゲットが8.0未満の場合、この警告はUILabelsによってトリガーされます。

それを見つける方法は?

  1. Issue Navigator(CMD + 8)および警告付きでビルドされた最新のものを選択 enter image description here
  2. 警告を見つける( " Automatic Preferred Max Layout "を検索して、右側にある展開ボタンを押します。
    enter image description here
  3. UILabelのオブジェクトIDを見つける enter image description here
  4. ストーリーボードを開き、オブジェクトのSEARCH(CMD + f)を開きます。それはSELECT AND HIGHLIGHT UILabelになります
  5. 他の人が示唆しているようにSet Preferred Width = 0 "Explicit"
36
Tibidabo

解決策はとても簡単です

IOS 8以降のビルドを有効にするだけです

enter image description here

23

まとめると、上記の2つの指示に従ってnumberOfLines = 0から1以上のインスタンスを変更し、ストーリーボードソース内のラベルの各インスタンスにpreferredMaxLayoutWidth = "0"を手動で追加すると、すべての警告が修正されました。

4
Lynn S

今私のXcodeのバージョンは6.1です。しかし、私もこの警告を受けました。それは私をとても悩ませます。何度も何度も検索した後、私は解決策を見つけました。

理由:ストーリーボードでUILabel Lines> 1を設定しておく必要があります。

解決策:ストーリーボードのUILabel Lines属性を1に設定します。 Xcodeを再起動してください。それは私のために働く、それがより多くの人々を助けることができると思います。

あなたが本当にあなたの言葉を1行以上見せる必要があるなら。あなたはそれをコードの中でやるべきです。

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.Origin.x, self.UserNameLabel.frame.Origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;
4
ronan

私は50の評判を持っていないのでStackoverflowは私が二番目に良い答えについてコメントさせてくれません。ストーリーボードで犯人ラベルを見つけるための別のトリックを見つけました。

ラベルのIDがわかったら、ビューコントローラを表示した状態で別のタブでストーリーボードを開き、コマンドFとコマンドVを実行すると、そのラベルに直接移動します。

3
Junaid Ahmed

私はW/Hの選択で持っていたオリジナルのレイアウトを選択することによってそれがうまくいった。ストーリーボードは期待どおりに機能しており、エラーはなくなりました。

IOS 8.0向けに開発していることも確認してください。プロジェクトの全般設定からそれを確認してください。

これはあなたが押すべき場所です。

2
AarneHuttunen

何らかの理由で、iOS Deployment Targetを8.0以上に変更しても、Xibファイルはその変更を採用せず、ファイルインスペクタの以前の設定のままになります。

File inspector in the Xib after changing the iOS Deployment target

そのため、Xibごとに手動で変更する必要があります Afther the manual change

完了すると、警告は消えます。

1
Gutty1

私はこの問題を抱えており、ラベルの最大値を決定するための制約を追加することでそれを修正することができました。

複数行のラベルをドロップするときに、親ビュー内の幅を強制するように設定された制約はありません。これが新しいPreferredMaxWidthが登場するところです。 iOS 7以前では、最大幅を自分で定義する必要があります。ラベルの左右に10pxの制約を追加しました。

また、問題を解決する<= width制約を追加することもできます。

したがって、これは実際にはバグではありません。最大幅を自分で定義するだけです。他の答えで明示的なオプションの言及はあなたがこの幅の値を設定しているときにもうまくいきますが、もしあなたが(あなたが明示的に幅を設定したように).

私の上記の解決策は、親ビューがどんなに大きくても、幅が常に維持されることを保証します。

1
Matthew Cawley