2013-09-28 11 views
13

Ho creato UIScrollView con insiemi di contenuto.Il paging UIScrollView abilitato con inset di contenuto funziona in modo strano

scrollView.frame = CGRectMake(-80, 180, 480, 190) 
self.scrollView.contentInset = UIEdgeInsetsMake(0, 160, 0, 160); 
self.scrollView.pagingEnabled = YES; 
[self.scrollView setContentSize:CGSizeMake(480, 190)]; 

// Add three Views 
[self.scrollView addSubview:view1]; 
[self.scrollView addSubview:view2]; 
[self.scrollView addSubview:view3]; 

[view1 setFrame:CGRectMake(0, 0, 160, 190)]; 
[view2 setFrame:CGRectMake(160, 0, 160, 190)]; 
[view3 setFrame:CGRectMake(320, 0, 160, 190)]; 

d

In un primo momento, era scrollView.contentOffset.x -160,0

Ma il problema strano è quando io batto sulla ScrollView (area gialla), il contenuto di valore x di offset è il ripristino a 0 e mostrato come Questo.

enter image description here

ho provato più volte, ma toccando scorrimento Visualizza reimposta il contenuto compensato a 0.

Come posso evitare questo?

+0

qual è il frame di 'scrollView'? –

+0

scrollView.frame = CGRectMake (-80, 180, 480, 190). Ho intenzione di fare come galleria. –

risposta

13

UIScrollView il paging funziona scorrendo le pagine con la stessa larghezza di scrollView (nel tuo caso pagine di larghezza 480). Ciò significa che hai una sola pagina (puoi ancora scorrere verso sinistra e verso destra a causa del contenuto di 160 inserti).

Un modo per fare questo lavoro sarebbe:

self.scrollView.frame = CGRectMake(80, 180, 160, 190); 
self.scrollView.clipsToBounds = NO; 
self.scrollView.contentInset = UIEdgeInsetsZero; 
self.scrollView.pagingEnabled = YES; 
[self.scrollView setContentSize:CGSizeMake(480, 190)]; 

questo modo attirare e scorrere correttamente, tuttavia, i lati dello schermo non saranno interattivi (80 pixel per ogni lato, poiché il controllo inizia a frame.origin.x = 80 e termina con 80 + 160 = 240).

La seconda opzione consiste nel gestire autonomamente il paging utilizzando i metodi forniti da UIScrollViewDelegate.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // pageIndex must be declared as a class member - this is used to prevent skipping pages during scroll 
    pageIndex = 0; 
    self.scrollView.frame = CGRectMake(0, 180, 320, 190); 
    self.scrollView.contentInset = UIEdgeInsetsMake(0, 80, 0, 80); 
    self.scrollView.pagingEnabled = NO; 
    self.scrollView.clipsToBounds = YES; 
    [self.scrollView setContentSize:CGSizeMake(480, 190)]; 
    self.scrollView.delegate = self; 
} 

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ 
    int pageWidth = 160; 
    int pageX = pageIndex*pageWidth-scrollView.contentInset.left; 
    if (targetContentOffset->x<pageX) { 
     if (pageIndex>0) { 
      pageIndex--; 
     } 
    } 
    else if(targetContentOffset->x>pageX){ 
     if (pageIndex<3) { 
      pageIndex++; 
     } 
    } 
    targetContentOffset->x = pageIndex*pageWidth-scrollView.contentInset.left; 
    NSLog(@"%d %d", pageIndex, (int)targetContentOffset->x); 
} 
+0

Ho bisogno di paging e contentinset, perché voglio vedere fuori dalla visualizzazione del contenuto. –

+0

La scrollview non ha una singola pagina, perché ha contentInset, ha 3 pagine –

+0

larghezza della pagina è '480' (dato che è la larghezza della tua' scrollview) '; 'insets' sono insieme' 320', che è inferiore a 1 pagina. In ogni caso, usare 'contentInset' non è la strada da percorrere poiché non va molto bene con il paging e le pagine non conterranno le visualizzazioni che ci si aspetta, a meno che non si centra ciascuna vista all'interno della sua pagina 480. –

2

Oltre al primo approccio di alex con l'impostazione clipsToBounds di NO, devono reagire alla coclea di fuori dei limiti vista scorrimento. Così ho creato la classe ScrollForwarderView che è sottoclasse di UIView.

ScrollForwarderView.h

#import <UIKit/UIKit.h> 

@interface ScrollForwarderView : UIView 
@property (nonatomic, weak) UIScrollView *scrollView; 
@end 

ScrollForwarderView.m

... 
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    if ([self pointInside:point withEvent:event]) { 
     return _scrollView; 
    } 
    return nil; 
} 

Poi posto UIView con classe personalizzata ScrollForwarderView al di sopra della vista di scorrimento, collegare proprietà ScrollView alla mia vista di scorrimento ed è ben inoltrato gli eventi utente per scrollview.

Problemi correlati