webentwicklung-frage-antwort-db.com.de

Xcode 8-UIB-Schaltflächen, bei denen Einschränkungen nicht angezeigt werden

Früher hat alles super funktioniert, bis ich gestern Xcode auf Version 8 aktualisiert habe.

Wenn ich keine Einschränkungen verwende, kann ich die Schaltflächen sehen, aber wenn ich Einschränkungen auf die Schaltflächen anwende, verschwinden sie, unabhängig davon, welche oder wie viele Beschränkungen (Höhe, vertikaler Abstand, Nachlauf usw.) angewendet werden.

Wenn ich auf Tasten tippe, wirken sie normal (Ereignisse werden immer gesendet, daher gehe ich davon aus, dass sie sich tatsächlich dort befinden (?)). Ich habe versucht, Textfarbe und Hintergrundfarbe zu ändern (sogar ein neues UIButton hinzugefügt), endete jedoch ohne Erfolg. Ich kann die Knöpfe nicht sehen. Wenn ich die Hintergrundfarbe von Centered View ändere, kann ich diese Änderung in der App sehen. Der verrückteste Teil ist, wenn ich auf Xcode Debug View Hierarchy klicke, um zu sehen, was los ist, dort sieht alles gut aus; Ich kann alle Tasten wie erwartet sehen.

 Constraints  Design

Testen der App sowohl auf dem iPhone 5 (iOS 9.3.5) als auch auf dem iPhone 6 (iOS 10).

Ich verwende Swift 2.3, iOS 10 und Xcode 8.

Ist das ein Fehler in Xcode 8? Wie kann dieses Problem gelöst werden?

UPDATE:

Ich habe gerade realisiert, dass das gleiche Einschränkungsproblem auch bei UILabel und UIImageView auftritt. Sie sehen ohne Einschränkungen gut aus, aber wenn ich Einschränkungen hinzufüge, verschwinden sie.

15
JustWork

Ich habe den Punkt verpasst, UIButton-Klasse auf meine benutzerdefinierte Klasse einzustellen. Ich habe meine benutzerdefinierte Klasse überprüft und gesehen, dass ich den Eckenradius für die awakeFromNib()-Methode festgelegt habe. Ich rief layoutIfNeeded() an, bevor ich den Eckenradius festlegte, was in meinem Fall die Lösung war.

2
JustWork

Dies wurde durch Erzwingen des Layouts vor dem Festlegen von layoutbezogenen Eigenschaften wie clipToBounds usw. gelöst. Der schwierige Teil ist, wo und wann layoutIfNeeded aufgerufen wird. 

In meinem Fall habe ich ein UIButton mit horizontalen, oberen und Höheneinschränkungen. Anscheinend wurde auf Xcode 8 der Titel meines Buttons plötzlich verschwunden. Dann erschien der Titel seltsam genug, nachdem ich die Höhenbeschränkung entfernt hatte. Dieses Verhalten weist auf ein Problem im Layoutzyklus der Ansicht hin. Ich musste die Höhenbeschränkung haben, also war das Entfernen nicht wirklich die Lösung. Also habe ich versucht, layoutIfNeeded aufzurufen, bevor ich die Einschränkungen setzte, aber keinen Effekt. 

Ich generiere diese Schaltfläche in viewDidLoad auf einem Controller über eine NSObject-Klasse, die sie behandelt. Die Lösung für mich war das Erzwingen einer layoutIfNeeded vor dem Aufruf der Methode, die die Schaltfläche setzt.

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view layoutIfNeeded];
    //editBooking - NSObject class where the button gets configured.
    [_editBooking setUpViews];
}

Zugehörige Probleme: clipsToBounds bewirkt, dass UIImage in iOS10 und XCode 8 nicht angezeigt wird

Bearbeiten:

"Ich denke, dass die (0, 0, 1000, 1000) gebundene Initialisierung der neue Weg ist Xcode instanziiert Ansichten von IB. Vor Xcode8 wurden Ansichten erstellt Mit ihrer konfigurierten Größe in der Xib-Datei und dann entsprechend verkleinert Bildschirm gleich danach. Aber jetzt ist keine konfigurierte Größe in IB Dokument vorhanden, da die Größe von Ihrer Geräteauswahl abhängt (am unteren Rand des Bildschirms). "

Referenz: Seit Xcode 8 und iOS10 wird die Größe der Ansichten in viewDidLayoutSubviews nicht richtig festgelegt

Aus den Apple-Versionshinweisen:

Beim Senden von layoutIfNeeded an eine Ansicht wird nicht erwartet, dass die Ansicht verschoben wird. Wenn in der Ansicht jedoch für TranslatesAutoresizingMaskIntoConstraints die Einstellung NO festgelegt wurde, würde LayoutIfNeeded die Ansicht verschieben, damit sie mit der Layout-Engine übereinstimmt, bevor das Layout gesendet wird der Teilbaum . Diese Änderungen korrigieren dieses Verhalten, und die Position des Empfängers und normalerweise seine Größe werden nicht durch layoutIfNeeded beeinflusst.

Einige vorhandene Codes stützen sich möglicherweise auf dieses falsche Verhalten, das jetzt korrigiert wird. Es gibt keine Verhaltensänderung für vor iOS 10 verknüpfte Binärdateien. Wenn Sie jedoch auf iOS 10 aufbauen, müssen Sie möglicherweise einige Situationen korrigieren, indem Sie -layoutIfNeeded an eine Übersicht der übersetzten Ansicht "translatesAutoresizingMaskIntoConstraints" senden, die der vorherige Empfänger war. oder danach, je nach gewünschtem Verhalten) layoutIfNeeded.

Referenz: Versionshinweise zu iOS10

20
Teffi

Ich habe gerade die Lösung gefunden. Dies ist höchstwahrscheinlich ein Xcode 8-Fehler. Ich bin auch mit diesem Problem konfrontiert.

Die Lösung besteht darin, die Xcode-Version im Interface-Builder zu ändern.

Schritte,

  1. Wählen Sie Ihre .xib-Datei aus. 

  2. Öffnen Sie den Abschnitt Dienstprogramme.

  3. Wählen Sie "Dateiinspektor" aus.

  4. Ändern Sie unter "Interface Builder Documents" die Xcode-Version von "Öffnet in" in "Xcode 7.x".

Ich denke, das wird dir helfen.

4
MacKa

Ich weiß nicht, ob es ein Fehler ist, aber ich habe es behoben, indem ich self.layoutIfNeeded() auf awakeFromNib()-Methode hinzufügte. Nur für den Fall, ich bin UIButton...

ABER, wenn nicht, können Sie nicht dasselbe Problem lösen, indem Sie diese Codezeile hinzufügen (zumindest nicht bei dieser Xcode-Version). Die Verwendung von viewDidLayoutSubviews() funktioniert auch nicht ...

1
Javier Siancas

Bestätigt, dass dies ein Problem mit XCode 8 ist, das derzeit (Stand 19. Oktober) über den App Store verteilt wurde. Es entfernt unnötigerweise ein <rect/>-Element aus den Storyboard/xib-Dateien.

Keine der layoutIfNeeded-Problemumgehungen funktioniert für mich. Ich habe XCode 8 Beta 3 heruntergeladen, wodurch dieses Problem behoben wurde.

1
John Wu

Es scheint, dass Xcode 8.1 Beta 2 (8T46g) das Problem der Inhaltsgröße von 1000 x 1000 (und natürlich die Probleme mit dem automatischen Layout in Tabellen-/Auflistungsansicht-Zellen) behebt. Was also in Xcode 7.x funktioniert, funktioniert in Xcode 8.1 Beta 2 problemlos.

0
Claudiu Matei

einschränkungen für den Bildlauf sollten sein: top,bottom,leading,trailing

einschränkung für contentview in scrollview sollte sein: top,bottom,leading,trailing,fixed height and center x(horizontally in container)

0
Lion