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


322

Xcode6 beta6で既存のiOSプロジェクトを開いたところ、XcodeはStoryboardファイルとXibファイルの両方に対して次の警告を表示します。

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

以下のように幅を明示的に設定することで警告に対処しようとしました:

それでも警告は解決されませんでした。どうすれば削除できますか?


3
XCode 6.1を使用していて、すべてのラベルをPreferred Width = Explicitに更新しました。これで問題は解決しました。
djburdick 14

回答:


373

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

再現する手順:

  1. 新しい単一ビューのObjective-Cプロジェクトを作成する
  2. デプロイメントターゲットを7.1に設定する
  3. プロジェクトのストーリーボードを開く
  4. 提供されたView Controllerにラベルをドロップします
  5. そのラベルのnumberOfLinesを2に設定します。
  6. コンパイル

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

更新2:
残念ながら、これはXcode 6のリリースバージョンでも同様です。ほとんどの場合、ストーリーボード/ xibを手動で編集して問題を修正できます。以下のコメントのチャールズA.によると:

この警告を誤って簡単に紹介してしまう可能性があり、警告自体は犯人であるラベルを見つけるのに役立ちません。これは、複雑なストーリーボードでは残念です。ストーリーボードをソースファイルとして開き、正規表現で検索して<label(?!.*preferredMaxLayoutWidth)、preferredMaxLayoutWidth属性/値を省略しているラベルを見つけることができます。そのような行にpreferredMaxLayoutWidth = "0"を追加する場合、これは明示的にマークして値0を設定することと同じです。

アップデート1:
このバグはXcode 6 GMで修正されました。

元の回答
これはXcode6-Beta6およびXCode6-Beta7のバグであり、現時点では無視しても問題ありません。

アップルデベロッパーフォーラムのアップルエンジニアは、バグについて次のように述べています。

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

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

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

警告が表示されるのは、(1)自動レイアウトを使用している、(2)複数行のラベルに「自動」が設定されている[ラベルのサイズインスペクターで確認できる]、(3)デプロイターゲット<iOS 8。

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

または、問題のストーリーボードまたはxibのファイルインスペクターを使用して問題を回避し、「ビルド」を「iOS 8.0以降のビルド」に変更することができます。 Xcodeファイルインスペクター


15
この警告を誤って簡単に紹介してしまう可能性があり、警告自体は原因のラベルを見つけるのに役立ちません。これは、複雑なストーリーボードでは残念です。ストーリーボードをソースファイルとして開き、正規表現で検索して<label(?!.*preferredMaxLayoutWidth)preferredMaxLayoutWidth属性/値を省略しているラベルを見つけることができます。そのpreferredMaxLayoutWidth="0"ような行を追加する場合は、明示的にマークして値を設定するのと同じです0
Charles A.

6
プログラムでUILabelを構成して、preferredMaxLayoutWidthを実際にサブクラス化したり、layoutSubviewsのどこかに実装したりせずに自動的に調整する方法はありますか?これがIBで有効にできる動作である場合、設定できるプロパティまたはマジック値があることを示しています。しかし、APIのドキュメントやヘッダーには、そのように書かれていません。
藻類、2014年

2
@CharlesA。私は空のプロジェクトでテストしていて、この警告をトリガーする別のラベル属性を見つけましnumberOfLinesた。1以外に設定すると、設定したかどうかに関係なく警告が発生しますpreferredMaxLayoutWidth
メモン14年

2
@ MichaelG.Emmons奇妙なことに、クリーンなプロジェクトと7.1に設定されたデプロイメントターゲットではこれを再現できません。をpreferredMaxLayoutWidth明示的な0 に設定すると、numberOfLines値に関係なく警告が消えます。しかし、おそらくこれは今朝のXcodeアップデートで修正されたのでしょうか?
Charles A.

2
それで...行数を1に設定してコードから変更する唯一の解決策は何ですか?これは専門的ではないようです
jomafer 2014

315

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

  1. xCodeのIssue Navigatorでエラーを右クリックし、[Reveal In Log]を選択します。(注:@Samは以下を提案しています。xCodeのレポートナビゲーターを確認してください。また、@ Riveraはコメントに「Xcode 6.1.1以降、警告をクリックすると、競合するラベルが自動的に開いてハイライト表示される」と記しています。これはテストしていません)。

ここに画像の説明を入力してください

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

ここに画像の説明を入力してください

  1. 次に、ストーリーボードをソースファイルとして公開します。 ここに画像の説明を入力してください

  2. 探す。内容を見ると、ここからどのラベルなのかが非常に簡単にわかるはずです。 ここに画像の説明を入力してください

ラベルを見つけたら、「優先幅」を0に設定するのが私の解決策でした。

ここに画像の説明を入力してください

ところで、インターフェイスアイテムを選択し、IDインスペクターの下を見ることで、インターフェイスアイテムのIDをいつでもすばやく取得できます。とても便利な。

ここに画像の説明を入力してください


36
これは受け入れられる答えになるはずです!これは実際に問題を解決します。通常は表示されないストーリーボードの他の問題を見つけるのにも役立ちます。一つのこと:私はそれを見つけるレポートナビゲータは、「ログに公開する」を右クリックよりもはるかに信頼性がある
サム・スペンサー

1
非常にシンプルなこの答えを愛し、警告を修正しました。本当にありがとう!
イーサンパーカー

1
u soooo muchhhhhh :)に感謝します
SR Nayak

2
インターフェイスビルダーに表示される幅ではなく、推奨される幅をゼロに設定するのはなぜですか?
Biclops 2015

9
素晴らしい答えです!ストーリーボードのIBビューから直接オブジェクトIDを検索できます。Ctrl-fを実行するだけです。これをソースコードとして開いてから、IBビューに切り替えて適切な幅を変更する必要はありません。
AndroidDev 2015年

36

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

それを見つける方法は?

  1. Issue Navigator(CMD + 8)に移動し、警告付きで最新ビルドを選択します ここに画像の説明を入力してください
  2. 警告を見つけ(自動優先最大レイアウト」を検索)、右側の展開ボタンを押します
    ここに画像の説明を入力してください
  3. UILabelのオブジェクトIDを見つける ここに画像の説明を入力してください
  4. オブジェクトのストーリーボードと検索(CMD + f)を開きます。UILabel を選択して強調表示します
  5. 他の人が提案したように、Preferred Width = 0 "Explicit"に設定します

23

ソリューションは非常に簡単です

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

ここに画像の説明を入力してください


非常にシンプルで破壊的です。iOSユーザーのわずか85%がiOS8 +上にあるdeveloper.apple.com/support/app-store
aryaxt

6
@aryaxt私はあなたが間違っていると言ってすみません。プロジェクト設定で展開ターゲットをiOS 7以下に設定し、IB DocumentsのビルドをiOS 8以降に変更できます。これはiOS 7で機能します。確認して反対票を削除してください。あなたはここでそれを確認することができますdeveloper.apple.com/library/ios/recipes/...
アレハンドロLuengo

1
いつものように、最良の答えは受け入れられたものではありません... :)乾杯!
HepaKKes 2015年

iOS9.3以降のアップデート:iOS7デバイスは、上記の設定でストーリーボードをレンダリングしなくなりました。これは、9.3アップデートの前に機能していました。Appleはプレリリースの自動化プロセスで何かを変更したようです。
pechar

4

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

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

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

あなたが本当にあなたの言葉を2行以上表示する必要がある場合。コードで行う必要があります。

//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;

3
「本当に1行以上の単語を表示する必要がある場合は、コードで実行する必要があります。」これはトロールですよね?
webstersx 2015

@webstersx私は彼が深刻だと思う
ジャスパー

4

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


おいuはウィザードです!期待どおりにUIScrollerViewでも機能します。これまでのベストソリューションは、Nibの展開のターゲットをiOS7.0に残すことができたためです
Yaro

3

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

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


プロジェクトでラベルIDを検索することを意味します。
Borzh 2015

2

私は、W / Hの選択で持っていた元のレイアウトを選択することで機能しました。ストーリーボードは期待どおりに機能しており、エラーは発生していません。

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

ここを押すべきです。


1

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

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

また、問題を修正する<=幅制約を追加することもできます。

したがって、これは実際にはバグではなく、最大幅を自分で定義する必要があります。他の回答での明示的なオプションの言及は、この幅の値を設定するときにも機能しますが、(幅を明示的に設定したため)親の幅に基づいて最大幅を変更する場合は、この値を変更する必要があります。

上記のソリューションでは、親ビューの大きさに関係なく、常に幅が維持されます。


1

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

iOS展開ターゲットを変更した後のXibのファイルインスペクター

したがって、Xibごとに手動で変更する必要があります 手動変更後

完了すると、警告は消えます:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.