2009-09-18 13 views
8

Mam UIScrollView z stronicowanie w nim (tak typowy model z UIPageControl i przeciąganie/przesuwanie w lewo i prawo między stronami), i mam to działa dobrze. Dziwne jest to, że gdy chciałem się pozbyć podskakiwania (tak, że nie widzisz czerni za interfejsem po lewej i prawej stronie), nagle stronicowanie już nie działa.UIScrollView - (bounce = NO) wydaje się przesłonić (pagingEnabled = YES)

Innymi słowy, gdy:

scrollView.pagingEnabled = YES; 
scrollView.bounces = YES; 

Wszystko działa poprawnie, z wyjątkiem I nie lubią odbijając na stronie (0) i strony (długość-1). Ale kiedy to zrobię:

scrollView.pagingEnabled = YES; 
scrollView.bounces = NO; 

Zatrzymuje zatrzaskiwanie na miejscu na każdej stronie, zamiast tego traktuje wszystkie strony razem jako jedną długą stronę. Wygląda więc na to, że z jakiegoś powodu stronicowanie zależy od podskakiwania, co jest w porządku, dopóki mogę jakoś powstrzymać podskakiwanie. Czy istnieje inny sposób na pozbycie się tego? Czy jest coś, co robię źle?

EDIT: Rozwiązanie:

@interface PagingScrollView : UIScrollView 
@end 

@implementation PagingScrollView 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     self.pagingEnabled = YES; 
     self.bounces = YES; 
    } 
    return self; 
} 

- (void)setContentOffset:(CGPoint)offset 
{ 
    CGRect frame = [self frame]; 
    CGSize contentSize = [self contentSize]; 
    CGPoint contentOffset = [self contentOffset]; 

    // Clamp the offset. 
    if (offset.x <= 0) 
     offset.x = 0; 
    else if (offset.x > contentSize.width - frame.size.width) 
     offset.x = contentSize.width - frame.size.width; 

    if (offset.y <= 0) 
     offset.y = 0; 
    else if (offset.y > contentSize.height - frame.size.height) 
     offset.y = contentSize.height - frame.size.height; 

    // Update only if necessary 
    if (offset.x != contentOffset.x || offset.y != contentOffset.y) 
    { 
     [super setContentOffset:offset]; 
    } 
} 

@end 

Odpowiedz

9

Najprościej byłoby napisać UIScrollView podklasy i wdrożyć odpowiednie zachowanie ręcznie. Powinieneś zacząć od pagingEnabled i bounces zarówno ustawionej na YES, a następnie zastąpić -setContentOffset: własną metodą, która klipuje krawędzie.

+0

Wow, to głupie. Cóż, spróbuję tego, możesz być po prostu "wielkim zwycięzcą" w tym temacie. – Eli

+0

To działa, ale musisz przesłonić -setContentOffset, nie -setContentOffset: animowany, ponieważ ten wywoła funkcję, która nie jest zawsze wywoływana, podczas gdy pierwsza zastępuje funkcję mutatora dla contentOffset, dzięki czemu złapiesz wszystkie przypadki. – Eli

+0

To dziwne. Robię dużo tego typu rzeczy i zwykle metoda pojedynczego parametru wywołuje animowany wariant z animacją: TAK – rpetrich

Powiązane problemy