2009-07-09 9 views
32

Czy istnieje sposób dezaktywacji spowalniania UIScrollView?Dezaktywuj UIScrollView zwalniając czasowo:

Chcę umożliwić użytkownikowi przewijanie płótna, ale nie chcę, aby płótno nadal przewijało się po podniesieniu palca przez użytkownika.

+1

Dlaczego miałbyś to zrobić? –

+5

Adam, Jestem świadomy, że zmiana domyślnego zachowania nie jest zalecana, ale myślę, że w moim szczególnym przypadku miałoby to sens. Wdrażam rozszerzone płótno z możliwością edycji obiektów bezpośrednio na płótnie. Wchodząc w ten tryb "na płótnie-edycję" chciałbym ograniczyć odległość, którą użytkownik przewija, aby obiekt był zawsze widoczny w widocznym zakresie. Wykorzystanie może przewijać dalej, ale podskoczyłby z powrotem na palec. Jestem świadomy właściwości contentSize, ale zakłóca to moje rosnące płótno. –

+2

W mojej sytuacji płaciliśmy za pracę najemną, a klient zażądał usunięcia ruchu opóźniającego. – Mark

Odpowiedz

60

Można to zrobić, korzystając z metody delegowania UIScrollViewscrollViewWillBeginDecelerating, aby automatycznie ustawić przesunięcie zawartości na bieżącą pozycję ekranu.

Aby wdrożyć:

  1. Przypisywanie delegata do obiektu UIScrollView, jeśli nie zostało to zrobione.
  2. W .m pliku wdrażania swojego delegata, należy dodać następujące wiersze kodu:

    -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ 
        [scrollView setContentOffset:scrollView.contentOffset animated:YES]; 
    } 
    

Voila! Nigdy więcej automatycznego przewijania.

+1

Nice. Nie mam pojęcia dlaczego, ale działa. Dziękuję Ci! –

+0

Kopalnia skacze do miejsca, w którym spowolnienie zakończyłoby się z powrotem do miejsca, w którym się zaczęło ... Jakieś sugestie? – jjxtra

+0

Działa poprawnie ... –

18

Możesz po prostu zwiększyć szybkość zwalniania bardzo wysoko. Z nieskończoną szybkością, natychmiast się zatrzyma. Spróbuj ustawić stopę do tych stałych:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal; 

i

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Jeśli szybko wciąż nie jest wystarczająco szybka, UIScrollViewDecelerationRateFast właśnie typedef'ed jako pływaka, więc można po prostu pomnożyć przez współczynnik 10 lub więcej, aby przyspieszyć jeszcze bardziej.

+0

Dziękuję za odpowiedź! Próbowałem różnych wartości dla właściwości decelerationRate, ale nie udało się sprawić, by spowolnienie pojawiło się nieistniejąco. Szybkie przesuwanie powoduje, że przewijanie przewija znaczną ilość. –

+9

Z mojego doświadczenia wynika, że ​​właściwość 'decelerationRate' odpowiada tylko wartościom wyjaśnionym w dokumentacji:' UIScrollViewDecelerationRateNormal' oraz 'UIScrollViewDecelerationRateFast'. –

+0

Tego właśnie szukałem. Dzięki :) – codeburn

38

W systemie iOS 5.0 lub nowszym istnieje lepsza metoda niż wywołanie setContentOffset:animated:.

Wdrożenie metody delegata scrollViewWillEndDragging:withVelocity:targetContentOffset: w pliku .m:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset { 
    *targetContentOffset = scrollView.contentOffset; 
} 

Przypisywanie prąd przesunięcia do targetContentOffset zatrzymuje UIScrollView z automatycznym przewijaniem.