2015-11-25 18 views
11

Chciałbym programowo ustawić contentOffset mojego przewijania, gdy contentOffset znajduje się pomiędzy dwoma punktami (patrz rysunek poniżej) z Swift.Gładkie przesunięcie contentoffset UIScrollView Swift

Problem polega na tym, że chciałbym dodać płynne przejście do przeniesienia, ale nie znalazłem dokumentacji na ten temat. Próbowałem wykonać pętlę, aby stopniowo zmniejszać przesunięcie zawartości, ale wynik nie jest zbyt dobry.

W tym przykładzie, jeśli przesunięcie treści jest mniejsze niż 150 pikseli na końcu zwoju, przechodzi ono płynnie (czas trwania animacji wynosi 1 sekundę) do punktu z przesunięciem równym 100. Maksymalnie 150 px, to idzie do 200px.

Jeśli możesz mi podać wskazówki (dokumentacja lub szybki przykład), co zrobić, byłoby wspaniale :) Dziękujemy!

enter image description here

Odpowiedz

17

Można użyć 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

Dziękuję bardzo, użyłem Twojego kodu, aby stworzyć wersję Swift 3. edytuj - opublikuję to jako odpowiedź na to pytanie, ponieważ kod jest tutaj niepoprawny. – user3739902

+1

@fatihyildizhan Użyłem tego kodu i działa jakbym się zachwycił, dzięki! Próbowałem zrobić to samo, ale nie w 'dispatch_async (dispatch_get_main_queue())' i to nie działało poprawnie, ponieważ podczas animacji contentOffset ustawia z powrotem na 0.0. Czy możesz wyjaśnić mi, dlaczego potrzebujemy tego make w 'dispatch_async (dispatch_get_main_queue())' do prawidłowego działania? – Mette

8

Oto wersja kodu fatihyildizhan za Swift 3.

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