2015-10-22 5 views
15

Ich habe 2 Verwirrung über ScrollView. Einer ist meine Hauptfrage, ein anderer ist sekundäre Verwirrung.Was genau sind contentOffset & contentInset von ScrollView

1.What genau contentOffse t & contentInset sind von Scroll. Ich werde mehr Details unten geben.

2.Ich erzeuge eine ScrollView, aber es scheint, dass die scrollView in keiner Richtung rollen kann. Ist das Problem mit Offset? ? Oder Einsatz .I geben mehr Einzelheiten unter

Details zu Frage 1:

Einige Zeit Content Eigenschaft & contentInset Eigenschaft scheinen viel Unterschied, aber wenn ich versuche, implementieren einige der Funktionen, die sich auf diese beiden Eigenschaften beziehen, beginne ich verwirrt. Und ich mache hier eine einfache Illustration. Können Sie mir es helfen, das herauszufinden, welcher Teil versetzt ist und welcher Teil ist Einschub: D

enter image description here

Details zu Frage 2:

I Funktion folgenden verwenden, um eine Scroll

hinzufügen
func addScrollView(){ 
      // assign a new ScrollView to "scroll" class member 
      scroll = UIScrollView(frame: CGRectZero) 
      scroll!.translatesAutoresizingMaskIntoConstraints = false 
      // change it to gray color to help recognising 
      scroll!.backgroundColor = UIColor.grayColor() 
      self.view.addSubview(scroll!) 

      //add some constraints,[you can neglect following part] 
      let x = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.CenterX, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterX, multiplier: 1, constant: 0) 
      self.view.addConstraint(x) 

      let y = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.CenterY, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.CenterY, multiplier: 1/2, constant: 25) 
      self.view.addConstraint(y) 

      let left = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.LeadingMargin, multiplier: 1, constant: 10) 
      self.view.addConstraint(left) 

      let upperSpacing = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: self.view, attribute: NSLayoutAttribute.Top, multiplier: 1, constant: 50) 
      self.view.addConstraint(upperSpacing) 

      let w = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.GreaterThanOrEqual, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 0, constant: 10) 
      self.view.addConstraint(w) 

      let h = NSLayoutConstraint(item: scroll!, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: scroll!, attribute: NSLayoutAttribute.Width, multiplier: 1, constant: 0) 
      self.view.addConstraint(h) 
      print("add scroll view Successed") 
     } 

Und es ist nicht in der Lage zu rollen. Es kann nur wenige Dinge (Buttons oder TextFields ...) enthalten, um seine Größe zu füllen, anstatt mehr Dinge an Orte zu legen, wo wir nicht sehen können.

Also sind die Probleme über die Einstellung & Einfügung? Wie kann ich das beheben? Und wenn ich das tue, wie kann ich Dinge (Buttons ..) zu den nicht gezeigten Orten programmatisch hinzufügen?

Ich hoffe, du kannst mir ein paar Dinge erzählen !! Mit meinem unendlichen schätzen! (Ich meine es wirklich! Ich blockiere mich hier seit Tagen !!!)

Antwort

20

Einige Beobachtungen:

  • Die contentOffset ist, wo der Benutzer derzeit in der Scroll-Ansicht gescrollt hat. Dies ändert sich offensichtlich, wenn der Benutzer scrollt. Sie ändern dies im Allgemeinen nicht programmgesteuert (es sei denn, Sie möchten einen programmgesteuerten Bildlauf durchführen, z. B. eine Schaltfläche, um nach oben zu scrollen).

  • Die contentInset ist, wie viel der Inhalt visuell in der Bildlaufansicht (d. H. Was die "Ränder" in der Bildlaufansicht sind) ist. Sie setzen dies normalerweise einmal in IB oder in viewDidLoad, wenn die Bildlaufansicht instanziiert wird.

  • Die contentSize ist, wie groß der scrollbare Inhalt ist. Beachten Sie, dass Sie dies bei der automatischen Layout-Zuweisung nicht manuell angeben müssen, sondern anhand der Einschränkungen, die Sie zwischen der Bildlaufansicht und ihren Unteransichten (und den Einschränkungen für die Untersichten und zwischen den Untersichten) festgelegt haben.

Zum Scrollen richtig zu arbeiten, ist es eine Kombination aus (a) die bounds der Scroll-Ansicht, abzüglich allfälligen contentInset; und (b) die contentSize, wie für Sie aus den Einschränkungen der Untersichten berechnet.

+0

Hallo Rob! Vielen Dank ! Und ich kann zuerst 2 folgen. Aber um die dritte zu vereinfachen, möchte ich bestätigen, dass die Dosis "scrollbarer Inhalt" einfach die Größe von scrollView bedeutet? – Microos

+1

Nein, mit "scrollbarem Inhalt" bezog ich mich auf alle Teilansichten der Bildlaufansicht. Und wenn für alle diese Subviews die Einschränkungen vollständig definiert sind, wird die Inhaltsgröße der Bildlaufansicht berechnet und für Sie festgelegt. Stellen wir uns also vor, dass Ihre Scroll-Ansicht 480 Punkte groß ist, aber die Höhe (wie durch Einschränkungen vorgegeben) aller Unteransichten und deren Abstand zu 700 Punkten ("contentSize.height" ist 700), dann wäre es möglich Scrollen Sie innerhalb der 480-Punkt-Scroll-Ansicht um 700 Punkte nach oben und unten. – Rob

2

contentOffset zeigt die aktuelle Position des Bildlauf Inhalt, relativ zu den Koordinaten des Originals in der oberen linken Ecke. Sie sollten diesen Wert nicht programmgesteuert festlegen, es sei denn, Sie möchten die Bildlaufposition programmgesteuert anpassen.

contentInset können Sie Ränder um den Inhalt in der Scrollview angeben. Sie können den Rand programmatisch wie folgt angeben:

scrollView.contentInset = UIEdgeInsetsMake(0, 0, 0, 7.0) 
+0

Hallo! Eneko Alonso, danke zuerst deiner Antwort! Ich möchte fragen, dass programmatisch festgelegt, dass die Einfügung beabsichtigt ist, einen kleineren Bereich für Benutzer zum Anzeigen des Inhalts zu machen. Habe ich recht? – Microos