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);
}
}
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
@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ć? –
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