wake-up-neo.net

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

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

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 als explizit festgelegt habe:

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

321
mono

Update 3:
Diese Warnung kann auch von Labels ausgelöst werden, für die numberOfLines auf etwas anderes als 1 festgelegt ist, wenn Ihr Bereitstellungsziel auf 7.1 festgelegt ist. Mit dem neuen Single-View-Projekt ist dies 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 eine Beschriftung auf dem bereitgestellten Ansichtscontroller ab
  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 zum größten Teil 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 den Schuldigen darstellt. Dies ist in einem komplexen Storyboard unglücklich. Sie können das Storyboard als Quelldatei öffnen und mit der Regex <label(?!.*preferredMaxLayoutWidth) nach Beschriftungen suchen, bei denen das Attribut/der Wert preferredMaxLayoutWidth fehlt. Wenn Sie in solchen Zeilen preferredMaxLayoutWidth = "0" hinzufügen, entspricht dies der expliziten Markierung und dem Festlegen des Werts 0.

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

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

Ein Apple Ingenieur in den Apple Entwicklerforen hatte dies zu dem 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 dem Inhalt zu entsprechen. Xcode-Versionen vor 6.0 würden preferredMaxLayoutWidth für mehrzeilige Beschriftungen zur Entwurfszeit auf die aktuelle Begrenzungsgröße festlegen. Sie müssen preferredMaxLayoutWidth zur Laufzeit manuell aktualisieren, wenn sich Ihr horizontales Layout ändert.

iOS 8 fügte die Unterstützung für die automatische Berechnung von preferredMaxLayoutWidth zur Laufzeit hinzu, 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 in Xcode 6 im Größeninspektor für preferredMaxLayoutWidth entweder "Automatisch" oder "Explizit" auswählen. Du solltest:

Wählen Sie "Automatisch", wenn Sie iOS 8 als Ziel wählen, um die beste Erfahrung zu erzielen. Wählen Sie "Explizit", wenn Sie auf <iOS 8 abzielen. Sie können dann den Wert von preferredMaxLayoutWidth eingeben, den Sie festlegen möchten. Wenn Sie "Explizit" aktivieren, wird standardmäßig die aktuelle Begrenzungsgröße verwendet, als Sie das Kontrollkästchen aktiviert haben.

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 Dokumente ohne automatische Layouterstellung 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 für das betreffende Storyboard oder xib verwenden und "Builds für" in "Builds für iOS 8.0 und höher" ändern. Xcode file inspector

373
memmons

Gehen Sie folgendermaßen vor, um die Problembezeichnungen in einem großen Storyboard zu finden.

  1. Klicken Sie im xCode Issue Navigator mit der rechten Maustaste auf den Fehler und wählen Sie "Reveal In Log". (Hinweis: @Sam schlägt Folgendes vor, schauen Sie in xCodes Berichtsnavigator nach. Auch @Rivera merkt in den Kommentaren an, dass "Ab Xcode 6.1.1 das Klicken auf die Warnung automatisch das widersprüchliche Etikett öffnet und hervorhebt". Ich habe das nicht getestet.

enter image description here

  1. Dadurch wird der Fehler mit einem Code am Ende Ihrer Storyboard-Datei angezeigt. Kopieren Sie den Wert nach .storyboard

enter image description here

  1. Zeigen Sie als Nächstes Ihr Storyboard als Quelldatei an. enter image description here

  2. Suche. Anhand des Inhalts sollten Sie leicht erkennen können, um welches Label es sich hier handelt. enter image description here

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

enter image description here

Übrigens, Sie können die ID eines Schnittstellenelements jederzeit schnell ermitteln, indem Sie das Element auswählen und im Prüfer "Identifizieren" nachsehen. Sehr praktisch.

enter image description here

315
smileBot

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. Wechseln Sie zu Issue Navigator (CMD + 8) und wählen Sie die neueste Version mit der Warnung aus enter image description here
  2. Suchen Sie die Warnung (en) (suchen Sie nach " Automatic Preferred Max Layout ") und drücken Sie die Erweiterungstaste rechts
    enter image description here
  3. Finden Sie die Objekt-ID des UILabels enter image description here
  4. Öffnen Sie das Storyboard und SEARCH (CMD + f) für das Objekt. Es wird SELECT AND HIGHLIGHT das UILabel
  5. Bevorzugte Breite = 0 "Explizit" einstellen wie von anderen vorgeschlagen
36
Tibidabo

Die Lösung ist ganz einfach

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

enter image description here

23

Zusammenfassend lässt sich sagen, dass ich die beiden obigen Anweisungen befolge, um alle Fälle zu ändern, in denen numberOfLines = 0 auf 1 oder höher gesetzt ist, und jeder Instanz eines Etiketts in der Storyboard-Quelle manuell preferredMaxLayoutWidth = "0" hinzufüge, um alle meine Warnungen zu korrigieren.

4
Lynn S

Jetzt ist meine Xcode-Version 6.1. Aber ich habe auch diese Warnung bekommen. es ärgert mich sehr. nach der suche immer wieder. ich habe die lösung gefunden.

Grund: Sie müssen Ihre UILabel-Linien in Ihrem Storyboard auf> 1 gesetzt haben.

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

Wenn Sie wirklich Ihre Wörter mehr als 1 Linie 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;
4
ronan

Da ich keine Reputation von 50 habe, möchte ich die zweitbeste Antwort von Stackoverflow nicht kommentieren. Es wurde ein weiterer Trick gefunden, um das Label des Täters im Storyboard zu finden.

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

3
Junaid Ahmed

Ich habe es funktioniert, indem ich das ursprüngliche Layout in der W/H-Auswahl ausgewählt habe. 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 in den allgemeinen Einstellungen des Projekts.

Hier sollten Sie drücken.

2
AarneHuttunen

Aus irgendeinem Grund übernehmen die Xib-Dateien diese Änderung nicht und behalten die vorherigen Einstellungen im Dateiinspektor bei, auch wenn Sie das iOS-Bereitstellungsziel auf 8.0 oder höher ändern

File inspector in the Xib after changing the iOS Deployment target

Daher sollten Sie es manuell für jedes Xib ändern Afther the manual change

Sobald dies erledigt ist, verschwindet die Warnung :-)

1
Gutty1

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

Beim Ablegen eines mehrzeiligen Etiketts ist keine Einschränkung festgelegt, um die Breite in der übergeordneten Ansicht zu erzwingen. Hier kommt das neue PreferredMaxWidth ins Spiel. Unter iOS 7 und früher müssen Sie die maximale Breite selbst festlegen. Ich habe der linken und rechten Seite des Etiketts einfach eine 10px-Einschränkung hinzugefügt.

Sie können auch eine <= -Breitenbeschränkung hinzufügen, um das Problem zu beheben.

Dies ist also eigentlich kein Fehler, Sie müssen lediglich die maximale Breite selbst definieren. Die explizite Option Erwähnung in einer anderen Antwort 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
Matthew Cawley