2016-08-08 30 views
2

Dies ist meine Ansicht, auf der linken Seite ist die Ansicht, wenn die Tastatur nicht angezeigt wird und auf der rechten Seite ist das, was ich erreichen möchte, wenn die Tastatur angezeigt wird.ContentInset von scrollView

enter image description here

Alle meine Felder zu einem Scrollview hinzugefügt werden, die ich dann Einschränkungen wie folgt festgelegt wird field1 topConstraint auf Scroll oben und field4 bottomConstraint ist auf Scroll Boden. Alle anderen Felder sind mit dem folgenden verknüpft.

Wie Sie von der rechten Mock-up sehen können, wenn Tastatur angezeigt wird, möchte ich die Ansicht so nachjustieren. Also, was ich tue jetzt:

func keyboardWillShow(notification: NSNotification) { 
     self.field2.snp_updateConstraints { make -> Void in 
      make.bottom.equalTo(self.field3.snp_top).offset(8) 
     } 

damit ich den großen Raum zwischen field2 und field3 anpassen, so weit so gut. Ich gehe auf dann die contentInset einzustellen:

let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height, 0) 

    self.scrollView.contentInset = contentInset 
    self.scrollView.scrollIndicatorInsets = contentInset 

aber die Scrollview ist so, wie ich will nicht einstellen, weil field3 noch halb hinter der Tastatur versteckt ist.

Der Grund für diesen Post ist, dass ich nicht verstehe, wie contentIsets mit scrollView arbeitet und ich möchte vermeiden, contentOffset manuell zu setzen, wenn das überhaupt möglich ist.

Es scheint ein Problem mit den Einschränkungen zu geben, die ich festlege. Die aktuelle Einschränkung für Feld4 ist, dass ich es an die Ansicht gebunden habe und nicht unten scrollen, und ich setze jede Kante der Bildlaufansicht so, dass sie an die Ansicht gebunden ist.

Updates: Wenn gesetzt i field4 untere Beschränkung auf die Scrollview gebunden werden, die scrollViews Höhe 0, Wie kann es nicht wissen, welche Größe sollte es sein, wenn ich vor nur die Scrollview gesetzt, so groß zu sein, wie die Aussicht selbst? Das hat wirklich verwirrte mich ..

Updates 2 ich die Scroll Einschränkungen wie diese Einstellung:

self.scrollView.snp_makeConstraints { make -> Void in 
     make.top.equalTo(self.snp_topLayoutGuideBottom) 
     make.left.right.equalTo(self.view) 
     make.bottom.equalTo(self.snp_bottomLayoutGuideBottom) 
    } 

Und von der UIDebugger kann ich sehen, dass die Höhe des Scroll das gleiche ist, aber die Y-Koordinate hat sich auf 20 geändert, aber ich kann immer noch nicht darin blättern ?? Auch beim Debuggen kann ich einstellen, dass die scrollViews contentSize größer als der Frame ist, dh es sollte scrollbar sein, ist es aber nicht.

Update 3 Ich bin jetzt zu dem Verständnis gekommen, dass Field1 und Field4 beide ScrollViews oben und unten angefügt werden müssen. Daher gibt es einen Unterschied zwischen scrollViews frame und scrollViews contentSize, da es so aussieht, als ob contentSize> frame scrollView scrollbar ist. Das ist also ein großer Schritt für mich und das einzige komische Ding ist jetzt das contentInset.

Mein Verständnis mit dem contentInset ist, dass Sie angeben, um wie viel die Ansicht in beide Richtungen verkleinert werden sollte. So, wie es jetzt ist, mache ich die Einfügung mit der Höhe der Tastatur am unteren Rand der ScrollView, aber es scrollt nicht, aber wenn ich die oberste contentInset auf eine zufällige negative Ziffer wie -100 setze, scrollt es, warum? Dieses Verhalten wird nicht erreicht, wenn der untere Einschub angepasst wird.

+0

Sie wollen also nicht Ihr "Feld 4" bewegen, es sollte unabhängig von der Tastatur sein, oder? Es tut mir leid, eigentlich habe ich keine Erfahrungen in diesem Bereich, also hilft mein Kommentar wahrscheinlich nicht viel. Aber ich will nur sehen, ob ich das richtig verstehe, da mich auch die Antwort auf deine Frage interessiert. – Andrej

+0

Ja genau, field4 sollte nicht bewegen. –

Antwort

0

So löste ich dies mit den folgenden:

Ich stellte sicher, dass Field1 und Field4 Zwänge auf die Scrollview gesetzt wurde, auf diese Weise die Scrollview war automatisch in der Lage, die Höhe zu berechnen, und machte auch scrollen es möglich, wenn Etwas Inhalt war außerhalb der Sicht. Ich berechnete dann den sichtbaren Rahmen von der Tastaturoberseite und -rahmen.

func keyboardWillShow(notification: NSNotification) { 

    self.Field2.snp_updateConstraints { make -> Void in 
     make.bottom.equalTo(self.Field3.snp_top) 
    } 

    self.Field3.snp_updateConstraints { make -> Void in 
     make.bottom.equalTo(self.Field4.snp_top) 
    } 

    self.view.layoutIfNeeded() 

    let contentInset = UIEdgeInsetsMake(0, 0,getKeyboardSize(notification).height + 4, 0) 
    let visibleRect = UIEdgeInsetsInsetRect(self.scrollView.frame, contentInset) 
    let scrollToOffset = max(0,self.Field4.frame.maxY - visibleRect.height) 
    self.scrollView.setContentOffset(CGPoint(x: 0, y: scrollToOffset), animated: true) 
} 

Der Schlüssel war nach den Zwängen zu ändern, ich brauchte das aktuelle Layout zu entkräften und die Ansichten wieder abstecken, dass die Art, wie wir Berechnungen, bei denen die aktualisierten Einschränkungen, wo es richtig gemacht werden können.

Verwandte Themen