2012-05-01 17 views
6

Tworzę aplikację na iPhone'a z dużym, panoramicznym obrazem 360 stopni. Panorama jest CATiledLayer w UIScrollView.Nieskończone przewijanie - setContentOffset: zatrzymuje hamowanie UIScrollView

Próbuję zaimplementować nieskończone przewijanie obrazu (tylko w poziomie). Zrobiłem to poprzez podklasowanie UIScrollView i implementowanie zestawu setContentOffset: i setContentOffset: animated: i działa to doskonale, gdy użytkownik przeciąga przewijany widok. Jednak gdy użytkownik podniesie palec, a widok przewijania zwalnia, zmiana parametru contentOffset powoduje natychmiastowe zatrzymanie opóźnienia.

- (void)setContentOffset:(CGPoint)contentOffset 
{  
    CGPoint tempContentOffset = contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     tempContentOffset = CGPointMake(1, tempContentOffset.y); 
    } 
    else if ((int)tempContentOffset.x <= 0) 
    { 
     tempContentOffset = CGPointMake(5113, tempContentOffset.y); 
    } 

    [super setContentOffset:tempContentOffset];  
} 

Czy istnieje sposób zmiany contentOffset bez wpływu na opóźnienie?

Zostało zasugerowane here, że nadpisanie setContentOffset: (nie setContentOffset: animated :) rozwiązuje ten problem, ale wydaje mi się, że nie działa.

Próbowałem również scrollRectToVisible: animated: bez powodzenia.

Wszelkie pomysły na rozwiązanie tego problemu byłyby bardzo mile widziane. Dzięki!

EDIT:

Kod scrollViewDidScroll:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    [panoramaScrollView setContentOffset:panoramaScrollView.contentOffset]; 
} 

Próbowałem też tak:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    CGPoint tempContentOffset = panoramaScrollView.contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(1, panoramaScrollView.contentOffset.y); 
    } 
    else if ((int)tempContentOffset.x == 0) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(5113, panoramaScrollView.contentOffset.y); 
    } 
} 

Odpowiedz

2

I rozwiązany z obejścia. Stworzyłem obraz panoramiczny z 3 pełnymi szerokościami panoramy (nie wpływa to zbytnio na wydajność, ponieważ używam CATiledLayer) i ustawię właściwośćna UIScrollViewDecelerationFast. Dlatego użytkownik nie jest w stanie przewinąć się zbyt daleko, zanim zatrzyma się spowolnienie, a jeśli opóźnienie zatrzyma się w lewym lub prawym obrazie panoramy, przesunięcie zawartości zostanie następnie zmienione z powrotem na środkowy obraz. Ma wygląd nieskończonego przewijania i jest to najlepsze rozwiązanie, jakie mogę wymyślić.

+0

Aby uniknąć potrzeby 'UIScrollViewDecelerationFast', możesz uczynić' contentSize' bardzo dużym, zacząć od widoku o potrójnej szerokości i punktu widzenia w środku, i ustawić dla tego widoku zawartości do zmiany położenia podczas przewijania; następnie, gdy hamowanie zatrzyma się, ponownie wrzuć wszystko do środka. – hatfinch

+0

@hatfinch Dzięki za komentarz. W zasadzie to właśnie robiłem, ale nie jestem w 100% pewien, co miałeś na myśli, "zaaranżuj, aby widok zawartości został zmieniony podczas przewijania". Czy możesz wyjaśnić, jak to będzie działać? –

+0

To działałoby tak, jak opisana metoda, ale zamiast spowalniać spowalnianie, aby użytkownik nie mógł przewijać panoramy o trzech szerokościach, przesuwasz panoramę. Tak więc dla ABC "content view" masz xxxABCxxx w scrollview (x to po prostu puste miejsce) i kiedy użytkownik przewija np. po lewej stronie, po przewinięciu jednej szerokości obrazu, przenosimy widok zawartości, aby uzyskać xxABCxxxx. Poza tym, że robisz to z tak wieloma 'x', że musieliby być bardzo rozmyślnie próbując dotrzeć do krawędzi. Czy to ma sens? – hatfinch

0

chciałbym spróbować użyć metody protokołu UIScrollViewDelegate:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 

to się nazywa po przewijania użytkownika (nawet gdy jest zwalnianie)

i wewnątrz niego chciałbym zmienić contentoffset

+0

Sposób scrollViewDidScroll gdzie Wołam metodę setContentOffset pokazanego powyżej. Próbowałem również bezpośrednio ustawienie contentOffset w scrollViewDidScroll, ale bez powodzenia. Po ustawieniu kompensacji zawartości opóźnienie zatrzymuje się natychmiast. Wyjście dziennika poniżej pokazuje zmianę przesunięcia zawartości, a następnie wywoływane jest scrollViewDidEndDecelerating. '(62.000000 0.000000) (22.000000 0.000000) (0.000000 0.000000) (5113.000000 0.000000) scrollViewDidEndDecelerating' –

+0

jak? opublikuj kod swojego scrollViewDidScroll ... – meronix

0

Niedawno robił tę samą nieskończoną przewijanie i przypadkowo znalazł rozwiązanie:

Wystarczy ustawić bounces=YES, alwaysBounceHorizontal=YES i/lub alwaysBounceVertical=YES (w zależności od kierunku, w którym do przewijania).

To wszystko, to działa dla mnie.:)

1

Zamiast

[scrollView setContentOffset:tempContentOffset]; 

użytku

scrollView.contentOffset = tempContentOffset; 
Powiązane problemy