2013-09-28 11 views
13

Utworzono UIScrollView z wstawkami zawartości.UIScrollView włączona obsługa stronicowania z treścią działa dziwnie

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

Po raz pierwszy scrollView.contentOffset.x był -160,0

Ale dziwne Problem jest kiedy dotknąć Scrollview (żółty obszar), zawartość przesunięcie wartość x jest zresetowanie 0 i pokazano jak to.

enter image description here

Próbowałem kilka razy, ale dotykając Scroll View resetuje zawartość przesunięcie 0.

Jak można temu zapobiec?

+0

co to jest ramka 'scrollView'? –

+0

scrollView.frame = CGRectMake (-80, 180, 480, 190). Zamierzam zrobić jak galerię. –

Odpowiedz

13

UIScrollView przywoływanie polega na przewijaniu stron o tej samej szerokości co scrollView (w przypadku stron o szerokości 480). Oznacza to, że masz 1 pojedynczą stronę (nadal możesz przewijać w lewo i w prawo z powodu 160 elementów).

Jednym ze sposobów, aby to działało byłoby:

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)]; 

ta opracuje i wskaż prawidłowo, jednak po bokach ekranu nie będzie interaktywny (80 pikseli z każdej strony, od startów kontrolnych w frame.origin.x = 80 i kończy na 80 + 160 = 240).

Druga opcja to samodzielna obsługa stronicowania, za pomocą metod dostarczonych przez 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

Potrzebuję stronicowania i treści, ponieważ chcę widzieć poza treścią. –

+0

Widok przewijania nie ma pojedynczej strony, ponieważ ma contentInform, ma 3 strony –

+0

szerokość strony to "480" (ponieważ jest to szerokość twojego 'przewijania)'; 'insets' są razem' 320', czyli mniej niż 1 strona. W każdym razie użycie 'contentInset' nie jest dobrym rozwiązaniem, ponieważ nie jest zbyt dobre w przypadku stronicowania, a strony nie zawierają pożądanych widoków, chyba że wyśrodkujesz każdy widok na jego 480 szerokiej stronie. –

2

Poza pierwszym podejściu Alexa z ustawieniem clipsToBounds NO, potrzebne do reakcji na zwój poza widoku zwój granicach. Stworzyłem więc klasę ScrollForwarderView, która jest podklasą 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; 
} 

Następnie umieść UIView z niestandardowej klasy ScrollForwarderView powyżej widoku przewijania, odwołują się do własności Scrollview moim zdaniem przewijania i ładnie przekazała zdarzenia użytkownika do przewijania.

Powiązane problemy