2015-11-25 16 views
11

Vorrei impostare il contentOffset della mia scrollview a livello di codice quando contentOffset si trova tra due punti (vedere l'immagine sotto) con Swift.Spostamento fluido del contentoffset UIScrollView Swift

Il problema è che vorrei aggiungere una transizione fluida per lo spostamento, ma non ho trovato la documentazione per questo. Ho provato a fare un ciclo per diminuire gradualmente l'offset del contenuto ma il risultato non è così buono.

Con questo esempio, se l'offset del contenuto è inferiore a 150 px alla fine dello scorrimento, procede senza intoppi (la durata dell'animazione sarebbe 1 secondo) al punto con l'offset uguale a 100. Fino a 150 px, va a 200px.

Se è possibile fornire indicazioni (documentazione o esempio rapido) su cosa fare sarebbe fantastico :) Grazie!

enter image description here

risposta

17

È possibile utilizzare UIView.animations

func goToPoint() { 
    dispatch_async(dispatch_get_main_queue()) { 
     UIView.animateWithDuration(2, delay: 0, options: UIViewAnimationOptions.CurveLinear, animations: { 
     self.scrollView.contentOffset.x = 200 
     }, completion: nil) 
    } 
    } 
+0

Grazie mille, ho utilizzato il codice per rendere la versione Swift 3. modifica - lo posterò come risposta a questo perché il codice diventa disordinato qui. – user3739902

+1

@fatihyildizhan Quindi ha usato questo codice e funziona come se fossi un incantesimo, grazie! Ho provato a fare lo stesso, ma non in 'dispatch_async (dispatch_get_main_queue())' e non ha funzionato correttamente perché durante l'animazione contentOffset è tornato a 0.0. Potresti spiegarmi perché abbiamo bisogno di questa make in 'dispatch_async (dispatch_get_main_queue())' per funzionare correttamente? – Mette

8

ecco la versione Swift 3 del codice di fatihyildizhan.

 DispatchQueue.main.async { 
     UIView.animate(withDuration: 0.2, delay: 0, options: UIViewAnimationOptions.curveEaseOut, animations: { 
      self.myScrollView.contentOffset.x = CGFloat(startingPointForView) 
      }, completion: nil) 
    }