2009-09-18 3 views
8

Ho un UIScrollView con paging in esso (quindi il modello tipico con un UIPageControl e trascinamento/scorrimento rapido a sinistra ea destra tra le pagine), e ho che funziona bene. La cosa strana è che quando volevo sbarazzarmi del rimbalzo (in modo da non vedere il nero dietro l'interfaccia utente sui lati sinistro e destro), improvvisamente il paging non funziona più.UIScrollView - (rimbalzi = NO) sembra sovrascrivere (pagingEnabled = YES)

In altre parole, quando:

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

Tutto funziona bene, tranne che non mi piace il rimbalzo a pag (0) e la pagina (lunghezza-1). Ma quando faccio questo:

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

Si ferma scattare in posizione ad ogni pagina, invece trattando tutte le pagine insieme come una pagina lunga. Quindi sembra che per qualche ragione il paging dipende dal rimbalzo, che va bene finché posso in qualche modo fermare il bouncing. Quindi, c'è un altro modo per sbarazzartene? O c'è qualcosa che sto sbagliando?

EDIT: La soluzione:

@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 

risposta

9

la soluzione migliore sarebbe quella di scrivere un UIScrollView sottoclasse e implementare il comportamento desiderato manualmente. Dovresti essere in grado di iniziare con pagingEnabled e bounces entrambi impostati su YES e quindi sovrascrivere -setContentOffset: con il tuo metodo che ritaglia i bordi.

+0

Wow, è stupido. Bene, ci proverò, potresti essere il "grande vincitore" in questo argomento. – Eli

+0

Funziona, ma è necessario eseguire l'override di -setContentOffset, non -setContentOffset: animato, in quanto quest'ultimo chiamerà una funzione che non viene sempre chiamata, mentre il precedente sovrascrive la funzione del mutatore per contentOffset in modo da catturare tutti i casi. – Eli

+0

È strano. Faccio parte di questo genere di cose e di solito il metodo a parametro singolo chiama la variante animata con animazione: SI – rpetrich