Die automatische bevorzugte maximale Layoutbreite ist in iOS-Versionen vor 8.0 nicht verfügbar


322

Ich habe ein vorhandenes iOS-Projekt mit Xcode6 Beta6 geöffnet und Xcode listet die folgende Warnung für Storyboard- und Xib-Dateien auf:

Die automatische bevorzugte maximale Layoutbreite ist in iOS-Versionen vor 8.0 nicht verfügbar

Ich habe versucht, die Warnung zu beheben, indem ich die Breite wie folgt explizit eingestellt habe:

Dies löste jedoch nicht die Warnungen. Wie können sie entfernt werden?


3
Ich verwende XCode 6.1 und habe alle meine Beschriftungen auf Bevorzugte Breite = Explizit aktualisiert. Dies löste das Problem für mich.
Djburdick

Antworten:


373

Update 3:
Diese Warnung kann auch durch Beschriftungen ausgelöst werden, die numberOfLinesauf etwas anderes als 1 festgelegt wurden, wenn Ihr Bereitstellungsziel auf 7.1 festgelegt ist. Dies ist mit einem neuen Single-View-Projekt vollständig reproduzierbar.

Schritte zum Reproduzieren:

  1. Erstellen Sie ein neues Ziel-C-Projekt mit einer Ansicht
  2. Setzen Sie das Bereitstellungsziel auf 7.1
  3. Öffnen Sie das Storyboard des Projekts
  4. Legen Sie ein Etikett auf den bereitgestellten Ansichts-Controller
  5. Setzen Sie die numberOfLines für dieses Label auf 2.
  6. Kompilieren

Ich habe das folgende Radar abgelegt:
rdar: // problem / 18700567

Update 2:
Leider ist dies in der Release-Version von Xcode 6 wieder der Fall. Beachten Sie, dass Sie Ihr Storyboard / xib größtenteils manuell bearbeiten können, um das Problem zu beheben. Per Charles A. in den Kommentaren unten:

Es ist erwähnenswert, dass Sie diese Warnung ziemlich leicht versehentlich einführen können, und die Warnung selbst hilft nicht dabei, das Etikett zu finden, das der Schuldige ist. Dies ist in einem komplexen Storyboard unglücklich. Sie können das Storyboard als Quelldatei öffnen und mit dem regulären Ausdruck <label(?!.*preferredMaxLayoutWidth)nach Beschriftungen suchen, bei denen ein bevorzugtes Attribut / Wert von MaxLayoutWidth weggelassen wird. Wenn Sie in solchen Zeilen PreferredMaxLayoutWidth = "0" hinzufügen, entspricht dies dem expliziten Markieren und dem Setzen des Werts 0.

Update 1:
Dieser Fehler wurde jetzt in Xcode 6 GM behoben.

Ursprüngliche Antwort
Dies ist ein Fehler in Xcode6-Beta6 und XCode6-Beta7 und kann vorerst ignoriert werden.

Ein Apple - Ingenieur in der Apple Developer Foren hatte diese über den Fehler zu sagen:

Die bevorzugte maximale Layoutbreite ist eine Eigenschaft für das automatische Layout in UILabel, mit der es automatisch vertikal vergrößert werden kann, um es an den Inhalt anzupassen. Versionen von Xcode vor 6.0 würden bevorzugtMaxLayoutWidth für mehrzeilige Beschriftungen zur Entwurfszeit auf die aktuelle Grenzgröße festlegen. Sie müssten PreferredMaxLayoutWidth zur Laufzeit manuell aktualisieren, wenn sich Ihr horizontales Layout ändert.

iOS 8 bietet Unterstützung für die automatische Berechnung von PreferredMaxLayoutWidth zur Laufzeit, wodurch das Erstellen mehrzeiliger Beschriftungen noch einfacher wird. Diese Einstellung ist nicht abwärtskompatibel mit iOS 7. Um sowohl iOS 7 als auch iOS 8 zu unterstützen, können Sie mit Xcode 6 im Größeninspektor entweder "Automatisch" oder "Explizit" für PreferredMaxLayoutWidth auswählen. Du solltest:

Wählen Sie "Automatisch", wenn Sie auf iOS 8 abzielen, um die beste Erfahrung zu erzielen. Wählen Sie "Explizit", wenn Sie auf <iOS 8 abzielen. Anschließend können Sie den Wert von PreferredMaxLayoutWidth eingeben, den Sie festlegen möchten. Wenn Sie "Explizit" aktivieren, wird standardmäßig die aktuelle Grenzgröße zum Zeitpunkt des Aktivierens des Kontrollkästchens verwendet.

Die Warnung wird angezeigt, wenn (1) Sie das automatische Layout verwenden, (2) "Automatisch" für ein mehrzeiliges Etikett festgelegt ist [Sie können dies im Größeninspektor für das Etikett überprüfen] und (3) Ihr Bereitstellungsziel <iOS 8.

Es scheint, dass der Fehler darin besteht, dass diese Warnung für nicht automatisch ausgelegte Dokumente angezeigt wird. Wenn Sie diese Warnung sehen und kein automatisches Layout verwenden, können Sie die Warnung ignorieren.

Alternativ können Sie das Problem umgehen, indem Sie den Dateiinspektor auf dem betreffenden Storyboard oder xib verwenden und "Builds für" in "Builds für iOS 8.0 und höher" ändern. Xcode-Dateiinspektor


15
Es ist erwähnenswert, dass Sie diese Warnung ziemlich leicht versehentlich einführen können, und die Warnung selbst hilft nicht dabei, das Etikett zu finden, das der Schuldige ist. Dies ist in einem komplexen Storyboard unglücklich. Sie können das Storyboard als Quelldatei öffnen und mit dem regulären Ausdruck <label(?!.*preferredMaxLayoutWidth)nach Beschriftungen suchen, bei denen ein preferredMaxLayoutWidthAttribut / Wert weggelassen wird. Wenn Sie preferredMaxLayoutWidth="0"solche Zeilen hinzufügen , entspricht dies dem expliziten Markieren und Festlegen des Werts 0.
Charles A.

6
Gibt es eine Möglichkeit, ein UILabel programmgesteuert so zu konfigurieren, dass es bevorzugteMaxLayoutWidth automatisch anpasst, ohne es tatsächlich zu unterklassifizieren oder irgendwo in layoutSubviews zu implementieren? Wenn dies ein Verhalten ist, das IB aktivieren kann, deutet dies darauf hin, dass eine Eigenschaft oder ein magischer Wert festgelegt werden kann. Aber nichts in den API-Dokumenten oder Headern sagt das aus.
Algen

2
@ CharlesA. Ich habe mit einem leeren Projekt getestet und ein anderes Label-Attribut gefunden, das diese Warnung auslöst: Wenn numberOfLineses auf etwas anderes als 1 gesetzt ist, wird die Warnung unabhängig davon angezeigt, ob Sie sie preferredMaxLayoutWidthgesetzt haben oder nicht.
Memmons

2
@ MichaelG.Emmons Seltsam, ich kann dies nicht mit einem sauberen Projekt und einem auf 7.1 festgelegten Bereitstellungsziel reproduzieren. Sobald ich die preferredMaxLayoutWidthexplizite 0 gesetzt habe , verschwindet die Warnung unabhängig vom numberOfLinesWert. Aber vielleicht wurde dies heute Morgen im Xcode-Update behoben?
Charles A.

2
Also ... ist die einzige Lösung, um die Anzahl der Zeilen auf 1 zu setzen und sie vom Code zu ändern? das scheint nicht professionell
jomafer

315

Führen Sie die folgenden Schritte aus, um die Problembezeichnung (en) in einem großen Storyboard zu finden.

  1. Klicken Sie im Issue Navigator von xCode mit der rechten Maustaste auf den Fehler und wählen Sie "Im Protokoll anzeigen". (Hinweis: @ Sam schlägt unten, Blick in Xcode Bericht Navigator auch @Rivera Hinweise in den Kommentaren , dass „Ab Xcode 6.1.1, auf die Warnung klicken , wird automatisch geöffnet und markieren Sie den Konflikt Label“ Ich habe nicht getestet.. ).

Geben Sie hier die Bildbeschreibung ein

  1. Dies zeigt den Fehler mit einem Code am Ende Ihrer Storyboard-Datei an. Kopieren Sie den Wert nach .storyboard

Geben Sie hier die Bildbeschreibung ein

  1. Zeigen Sie als Nächstes Ihr Storyboard als Quelldatei an. Geben Sie hier die Bildbeschreibung ein

  2. Suche. Sie sollten in der Lage sein, anhand des Inhalts leicht zu erkennen, um welches Label es sich handelt. Geben Sie hier die Bildbeschreibung ein

Sobald Sie das Etikett gefunden haben, bestand die Lösung für mich darin, die "bevorzugte Breite" auf 0 zu setzen.

Geben Sie hier die Bildbeschreibung ein

Übrigens können Sie jederzeit schnell die ID eines Schnittstellenelements abrufen, indem Sie das Element auswählen und unter dem Identifizierungsinspektor nachsehen. Sehr praktisch.

Geben Sie hier die Bildbeschreibung ein


36
Dies sollte die akzeptierte Antwort sein! Dies löst tatsächlich das Problem. Es hilft sogar, andere Probleme im Storyboard zu finden, die normalerweise nicht angezeigt werden. Eine Sache: Ich finde, dass der Berichtsnavigator viel zuverlässiger ist, als mit der rechten Maustaste auf "Im Protokoll anzeigen" zu klicken
Sam Spencer

1
Ich liebe diese Antwort, sehr einfach und habe die Warnung behoben. Vielen Dank!
Ethan Parker

1
Vielen Dank soooo vielhhhhh :)
SR Nayak

2
Warum setzen Sie die bevorzugte Breite auf Null anstatt auf die im Interface Builder angezeigte Breite?
Biclops

9
Super Antwort! Sie können die Objekt-ID direkt in der IB-Ansicht des Storyboards suchen. Mach einfach eine Strg-F. Sie müssen es nicht als Quellcode öffnen und müssen dann zur IB-Ansicht zurückkehren, um die bevorzugte Breite zu ändern.
AndroidDev

36

Sie können dieses Problem beheben, ohne das Storyboard als Quelle zu öffnen . Diese Warnung wird von UILabels ausgelöst, wenn numberOfLines! = 1 und das Bereitstellungsziel <8.0 ist

WIE FINDEN SIE ES?

  1. Gehen Sie zu Issue Navigator (CMD + 8) und wählen Sie das zuletzt mit der Warnung erstellte aus Geben Sie hier die Bildbeschreibung ein
  2. Suchen Sie die Warnung (en) (suchen Sie nach " Automatic Preferred Max Layout ") und klicken Sie rechts auf die Schaltfläche "Erweitern"
    Geben Sie hier die Bildbeschreibung ein
  3. Suchen Sie die Objekt-ID des UILabel Geben Sie hier die Bildbeschreibung ein
  4. Öffnen Sie das Storyboard und suchen Sie (CMD + f) nach dem Objekt. Es wird das UILabel auswählen und hervorheben
  5. Setzen Sie Preferred Width = 0 "Explicit", wie von anderen vorgeschlagen

23

Lösung ist ganz einfach

Aktivieren Sie einfach Builds für iOS 8 und höher

Geben Sie hier die Bildbeschreibung ein


ganz einfach und destruktiv. Nur 85% der iOS-Benutzer sind auf iOS8 + developer.apple.com/support/app-store
aryaxt

6
@aryaxt Es tut mir leid zu sagen, dass Sie falsch liegen. Sie können ein Bereitstellungsziel in den Projekteinstellungen auf iOS 7 oder niedriger festlegen und Builds für in IB-Dokumenten auf iOS 8 und höher ändern. Dies funktioniert unter iOS 7. Bitte überprüfen Sie es und entfernen Sie die Downvote. Sie können es hier überprüfen. Developer.apple.com/library/ios/recipes/…
Alejandro Luengo

1
Wie immer ist die beste Antwort nicht die akzeptierte ... :) Prost!
HepaKKes

UPDATE für iOS9.3 und höher: iOS7-Geräte rendern keine Storyboards mehr mit der obigen Einstellung. Dies funktionierte vor dem 9.3-Update. Es sieht so aus, als hätte Apple etwas an seinem automatisierten Prozess vor der Veröffentlichung geändert.
Pechar

4

Jetzt ist meine Xcode-Version 6.1. Aber ich habe auch diese Warnung bekommen. es nervt mich sehr. Nach der Suche immer wieder. Ich fand die Lösung.

Grund: Sie müssen Ihre UILabel-Zeilen> 1 in Ihrem Storyboard festgelegt haben.

Lösung: Setzen Sie Ihr UILabel Lines-Attribut im Storyboard auf 1. Starten Sie Ihren Xcode neu. Es funktioniert für mich, hoffe es kann mehr Menschen helfen.

Wenn Sie wirklich Ihre Wörter mehr als 1 Zeile zeigen müssen. Sie sollten es im Code tun.

//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
"Wenn Sie Ihren Wörtern wirklich mehr als eine Zeile zeigen müssen, sollten Sie dies im Code tun." Das ist ein Troll, oder?
Webstersx

@webstersx Ich denke, er ist ernst
Jasper

4

Zusammenfassend lässt sich sagen, dass das Befolgen der beiden obigen Anweisungen zum Ändern von Fällen, in denen numberOfLines = 0 auf 1 oder höher ist, und das manuelle Hinzufügen von PreferredMaxLayoutWidth = "0" zu jeder Instanz eines Labels in der Storyboard-Quelle alle meine Warnungen behoben hat.


Alter, du bist ein Zauberer! Funktioniert auch mit einem UIScrollerView wie erwartet. BESTE LÖSUNG so weit , weil ich konnte meine Nib der Einsatz des Ziels auf iOS7.0 verlassen
Yaro

3

Da ich keinen Ruf von 50 habe, lässt mich Stackoverflow die zweitbeste Antwort nicht kommentieren. Es wurde ein weiterer Trick gefunden, um das Täterlabel im Storyboard zu finden.

Wenn Sie also die ID des Etiketts kennen, öffnen Sie Ihr Storyboard in einer separaten Registerkarte mit angezeigten Ansichts-Controllern und führen Sie einfach Befehl F und Befehl V aus, um direkt zu diesem Etikett zu gelangen :)


Sie meinen, im Projekt nach der Label-ID zu suchen.
Borzh

2

Ich habe es zum Laufen gebracht, indem ich das ursprüngliche Layout ausgewählt habe, das ich in der W / H-Auswahl hatte. Das Storyboard funktioniert wie erwartet und der Fehler ist behoben.

Stellen Sie außerdem sicher, dass Sie für iOS 8.0 entwickeln. Überprüfen Sie dies anhand der allgemeinen Einstellungen des Projekts.

Hier sollten Sie drücken.


1

Ich hatte dieses Problem und konnte es beheben, indem ich Einschränkungen hinzufügte, um das Maximum für ein Etikett zu bestimmen.

Wenn Sie ein mehrzeiliges Etikett ablegen, ist keine Einschränkung festgelegt, um die Breite in der übergeordneten Ansicht zu erzwingen. Hier kommt die neue PreferredMaxWidth ins Spiel. Unter iOS 7 und früheren Versionen müssen Sie die maximale Breite selbst definieren. Ich habe einfach eine 10px-Einschränkung auf der linken und rechten Seite des Etiketts hinzugefügt.

Sie können auch eine <= Breitenbeschränkung hinzufügen, die das Problem ebenfalls behebt.

Dies ist also eigentlich kein Fehler, Sie müssen lediglich die maximale Breite selbst definieren. Die explizite Option, die in einer anderen Antwort erwähnt wird, funktioniert auch, wenn Sie diesen Breitenwert festlegen. Sie müssen diesen Wert jedoch ändern, wenn sich die maximale Breite basierend auf der übergeordneten Breite ändern soll (da Sie die Breite explizit festgelegt haben).

Meine obige Lösung stellt sicher, dass die Breite immer beibehalten wird, egal wie groß die übergeordnete Ansicht ist.


1

Selbst wenn das iOS-Bereitstellungsziel auf 8.0 oder höher geändert wird, übernehmen die Xib-Dateien diese Änderung aus irgendeinem Grund nicht und bleiben bei den vorherigen Einstellungen im Dateiinspektor

Dateiinspektor in der Xib nach dem Ändern des iOS-Bereitstellungsziels

Daher sollten Sie es für jede Xib manuell ändern Nach dem manuellen Wechsel

Sobald dies erledigt ist, verschwindet die Warnung :-)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.