2009-09-18 4 views
8

Ich habe eine UIScrollView mit Paging drin (so das typische Modell mit einem UIPageControl und Drag/flicking links und rechts zwischen den Seiten), und ich habe das funktioniert gut. Das Seltsame ist, dass, wenn ich das Prellen loswerden wollte (so dass man hinter der UI auf der linken und rechten Seite kein Schwarz mehr sehen kann), plötzlich kein Paging mehr funktioniert.UIScrollView - (Bounces = NO) scheint zu überschreiben (PagingEnabled = YES)

Mit anderen Worten, wenn:

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

Alles funktioniert gut, außer Ich mag es nicht die auf Seite abprallen (0) und Seite (Länge-1). Aber wenn ich dies tun:

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

Er hält an ihren Platz auf jeder Seite schnappen, anstatt die Behandlung alle Seiten zusammen als eine lange Seite. Es scheint also so zu sein, dass Paging von einem Bouncing abhängig ist, was in Ordnung ist, solange ich das Aufprallen irgendwie stoppen kann. Also, gibt es einen anderen Weg, es los zu werden? Oder gibt es etwas, was ich falsch mache?

EDIT: Die Lösung:

@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 

Antwort

9

Ihre beste Wette wäre eine UIScrollView Unterklasse zu schreiben und das gewünschte Verhalten manuell zu implementieren. Sie sollten in der Lage sein, mit pagingEnabled und bounces beide auf YES setzen und dann -setContentOffset: mit Ihrer eigenen Methode überschreiben, die die Kanten schneidet.

+0

Wow, das ist dumm. Nun, ich werde das ausprobieren, du bist vielleicht der "große Gewinner" in diesem Thema. – Eli

+0

Es funktioniert, aber Sie müssen -setContentOffset, nicht -setContentOffset: animiert überschreiben, da letzteres eine Funktion aufrufen wird, die nicht immer aufgerufen wird, während ersteres die mutator-Funktion für contentOffset überschreibt, damit Sie alle Fälle abfangen können. – Eli

+0

Das ist seltsam. Ich mache eine Menge von dieser Art von Dingen und normalerweise ruft die Einzelparameter-Methode die animierte Variante mit animierten auf: YES – rpetrich

Verwandte Themen