2015-10-22 16 views
15

Ho 2 confusione su ScrollView. Una è la mia domanda principale, un'altra è una confusione secondaria.Cosa sono esattamente contentOffset e contentInset di ScrollView

1.What sono esattamente contentOffse t & contentInset di ScrollView. Darò più dettagli qui sotto.

2.Io creo una ScrollView, ma sembra che la scrollView non possa rotolare in alcuna direzione. Il problema dell'offset? ? O inserto .i gli darà più dettagli di seguito

dettagli per la domanda 1:

Qualche tempo proprietà contentOffset & contentInset proprietà sembrano avere un sacco di differenza, ma quando provo a implementare alcune delle funzioni che riguardano queste due proprietà, comincio a confondermi. E faccio una semplice illustrazione qui. Puoi aiutarmi a capirlo che quale parte è compensato e quale parte è inserto: D

enter image description here

Dettagli per domanda 2:

Io uso seguente funzione per aggiungere uno ScrollView

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") 
     } 

E non è in grado di rotolare. Può contenere solo poche cose (pulsanti o campi di testo ...) per riempire le sue dimensioni, piuttosto che mettere più cose in posti dove non possiamo vedere.

Quindi i problemi di impostazione iniziale sono &? Come posso impostare per risolvere questo? E se lo faccio, come posso aggiungere cose (pulsanti ...) ai posti non mostrati programmaticamente?

Spero che tu possa dirmi alcune cose !! Con il mio apprezzamento infinito! (Voglio dire, davvero! Mi blocco per giorni !!!)

risposta

20

Alcune osservazioni:

  • Il contentOffset è dove l'utente ha attualmente scorrimento all'interno della vista di scorrimento. Questo ovviamente cambia mentre l'utente scorre. Generalmente non lo si modifica a livello di codice (a meno che non si desideri scorrere a livello di codice da qualche parte, ad esempio un pulsante per scorrere verso l'alto).

  • contentInset è quanto il contenuto è visivamente inserito all'interno della vista di scorrimento (ovvero quali sono i "margini" all'interno della visualizzazione pergamena). Si imposta generalmente questa volta in IB o in viewDidLoad, in quanto la vista di scorrimento viene creata un'istanza.

  • contentSize indica quanto è grande il contenuto scorrevole. Nota, con l'esecuzione automatica, non è necessario specificarlo manualmente, ma viene calcolato dai vincoli specificati tra la visualizzazione a scorrimento e le sue sottoview (e i vincoli per le visualizzazioni secondarie e tra le sottoview).

Per ottenere lo scorrimento per funzionare correttamente, è una combinazione di (a) la bounds della vista di scorrimento, al netto di qualsiasi contentInset; e (b) lo contentSize, come calcolato per voi dai vincoli delle sottoview.

+0

Ciao Rob! Grazie ! E posso seguire prima 2. Ma per semplificare il terzo, voglio confermare che la dose "contenuto scorrevole" significa semplicemente la dimensione della scrollView? – Microos

+1

No, per "contenuto scorrevole" mi riferivo a tutte le sottoview della vista di scorrimento. E se tutte queste sottoview hanno i loro vincoli completamente definiti, allora il 'contentSize' della vista di scorrimento sarà calcolato e impostato per te. Immaginiamo quindi che la tua vista di scorrimento fosse alta 480 punti, ma l'altezza (come dettata dai vincoli) di tutte le sue sottoview e la loro spaziatura aumentavano fino a 700 punti ('contentSize.height' è 700), quindi potresti Scorri verso l'alto e verso il basso di 700 punti di contenuto all'interno della visualizzazione a scorrimento di 480 punti. – Rob

2

contentOffset indica la posizione corrente del contenuto della vista di scorrimento, relativa alle coordinate di origine nell'angolo in alto a sinistra. Non si dovrebbe impostare questo valore a livello di codice a meno che non si desideri regolare la posizione di scorrimento al livello di programmazione.

contentInset consente di specificare i margini attorno al contenuto nella vista a scorrimento. È possibile specificare il margine a livello di codice come segue:

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

Ciao! Eneko Alonso! Grazie per la tua risposta in un primo momento! Voglio chiedere che l'impostazione predefinita dell'inset sia l'intento di creare un'area più piccola per consentire all'utente di visualizzare il contenuto. Ho ragione? – Microos

Problemi correlati