Frage UIScrollView verwendet keine automatischen Layout-Einschränkungen


Ich habe eine Bildlaufansicht und eine Bildansicht dahinter und ich bevölkere es mit Federn. Ich benutze das automatische Layout. Ich habe einen Boden Platz Superview und ein Top-Platz, um auf beiden Ansichten Superview. Die Bildansicht macht genau das, was ich möchte. Für iPhone 5 ist es, wo ich es will. Und für die anderen iPhones bleibt es über dem unteren Rand des Bildschirms, so dass es die Größe korrekt ändert. Die Bildlaufansicht sieht auf dem iPhone 5 richtig aus, aber auf den anderen Telefonen wird die Größe nicht geändert, sodass sie unterhalb der Ansicht der App nach unten scrollt. Ich bekomme diese Nachrichten im Log:

 2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
  Try this: (1) look at each constraint and try to figure out which you don't expect;
  (2) find the code that added the unwanted constraint or constraints and fix it.
 (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer
  to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

"<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-|   (Names: '|':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0]   (Names: '|':ScheduleView:0x1d8efc30 )>"


 Will attempt to recover by breaking constraint 
 <NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom ==      UIImageView:0x1d892110.bottom>

Ich habe es schon versucht

[self setTranslatesAutoresizingMaskIntoConstraints:YES];

und

[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];

Von dem, was ich sehen kann, hebt das nur alle Einschränkungen von den Ansichten ab. Und ist nicht was ich will.


74
2017-11-21 18:11


Ursprung


Antworten:


Die Beziehung zwischen UIScrollView und dem automatischen Layout unterscheidet sich von anderen Aspekten des automatischen Layouts. Wenn ein einfaches Auto-Layout funktionieren würde, würde nichts scrollen. Wenn beispielsweise eine Unteransicht der Bildlaufansicht auf die normale Weise durch eine Einschränkung auf 10 Punkte vom oberen Rand der Bildlaufansicht fixiert wurde, wäre sie dort absolut fixiert. es würde sich nie bewegen, egal wie die Bildlaufansicht gescrollt wurde.

Um dieses Problem zu lösen, arbeitet ein UIScrollView, der das automatische Layout verwendet, auf eine völlig neue Art und Weise. Wenn Sie also sagen: "Ich benutze Auto-Layout", müssen Sie sich darauf einstellen, dass die Dinge anders funktionieren als zuvor. Sie müssen entweder eine einzelne Teilansicht der Bildlaufansicht mit verwenden translatesAutoresizingMaskIntoConstraints = YESund eine explizite Inhaltsgröße, sonst muss alles vorhanden sein translatesAutoresizingMaskIntoConstraints = NO und die Inhaltsgröße wird basierend auf den Einschränkungen der Untersichten implizit abgeleitet.

Dies wird sehr gut erklärt in https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html


169
2017-11-25 03:37



Sehr wichtig bei der Verwendung von Auto-Layout: Sie müssen den rechten und / oder den unteren Teil der letzten Unteransicht an die rechte und / oder untere Seite der Bildlaufansicht anheften. So kennt die Bildlaufansicht die Inhaltsgröße. Beispielsweise:

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
                                                 attribute:NSLayoutAttributeRight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:scrollView
                                                 attribute:NSLayoutAttributeRight
                                                multiplier:1.0
                                                  constant:0]];

Mein Dank an Diese Seite für das perfekte Beispiel.

Ich habe deswegen Stunden verloren und ich hoffe, anderen meinen Schmerz zu ersparen.


159
2018-04-16 04:50



Damit UIScrollviews gut mit Constraints funktioniert, benutze ich diesen Ansatz Hier. In dieser Antwort gehe ich darauf ein, wie man einen bekommt vertikal scrolling scrollview working, das auch mit der Gerätedrehung funktioniert. Sie können den Ansatz für die Arbeit optimieren horizontal scrollen auch scrollviews. Für Scrollviews, die in beide Richtungen scrollen, nicht Fügen Sie den Trick zur Größenanpassung der Breite hinzu. Aber mach alles andere gleich.


0
2018-01-22 03:47



Ein paar Dinge.

  1. Vergewissern Sie sich, dass das automatische Layout aktiviert ist (IB auf der Registerkarte "Datei-Inspektor").
  2. Stellen Sie sicher, dass Sie KEINE Änderungen vornehmen, die Begrenzungen, Rahmen usw. betreffen - dies geschieht jetzt durch automatische Beschränkungen
  3. Stellen Sie sicher, dass Sie AutoResizingMask nicht verwenden. Dies wird mit Ihren neuen Einstellungen konkurrieren. Wenn diese richtig gemacht werden, können Sie jetzt Ihren Knopf entwerfen und es wird großartig funktionieren. Hier ist wie.

Dieser Fehler besagt, dass entweder Ihre Feder oder ein Steuerelement in dieser Feder kein automatisches Layout verwendet.


-3
2017-11-24 05:55