UIScrollView Paging selber machen

  • UIScrollView Paging selber machen

    Hi,

    ich probiere das Paging der UIScrollView selber zu programmieren. Erstmal zu dem Problem, vielleicht hat ja einer eine bessere Idee.

    Ich habe mehrere Views in einer ScrollView. Die Scrollview geht über die gesamte Breite des iPads. Nun will ich aber beim durchblättern, das er beim Paging immer nur eine View weiter geht und die anderen rechts und links aber noch anzeigt. Das geht ja nach dem was ich weiß nicht, da Paging immer über die ganze Breite oder Höhe gehen muss.

    Also dachte ich mir ich programmiere mir das Paging selber, mit der ganzen Delegate von UIScrollView.

    PHP-Quellcode

    1. -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
    2. scrollStart = scrollView.contentOffset.x;
    3. NSLog(@"xStart:%i",scrollStart);
    4. }- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{
    5. scrollEnd = scrollView.contentOffset.x;
    6. NSLog(@"xEnd:%i",scrollEnd);
    7. }
    8. - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
    9. if (scrollStart < scrollEnd) {
    10. scrollStart = scrollStart+321;
    11. [scrollView setContentOffset:CGPointMake(scrollStart,scrollView.contentOffset.y) animated:YES];
    12. NSLog(@"Neuer - Start:%i",scrollStart);
    13. }
    14. else {
    15. scrollStart = scrollStart-321;
    16. if (scrollStart < 0) {
    17. scrollStart = 0;
    18. }
    19. [scrollView setContentOffset:CGPointMake(scrollStart,scrollView.contentOffset.y)animated:YES];
    20. NSLog(@"Neuer - Start:%i",scrollStart);
    21. }
    22. }
    Alles anzeigen



    Die Idee war es mit scrollViewWillBeginDrgging, den start Punkt zu speichern, mit scrollViewEndDragging den Endpunkt zu speichern und in scrollViewDidEndDrgging, dann mit setContenOffset, nach rechts oder links immer nur ein kleines Stück (321 Pixel / eine Viewbreite) weiter zu scrollen. Leider funktioniert das so nicht, manchmal geht es manchmal nicht. Über die Konsole lasse ich mir immer die Start und Endpunkte angeben, so wie es aussieht führt er die setContentOffset nicht richtig aus.

    Hat einer eine Idee oder sieht etwas was ich falsch mache?

    Schon mal Danke.

    Gruß
    Cabaalo
  • Wenn das Dragging zu Ende ist, verlangsamt der Scrollview das scrollen. D. h. er ist mit der Bewegung nur nicht fertig. Wahrschlich kollidiert diese Animation mit Deinem Setzen des Content-Offsets. In die Animationen des Scrollviews einzugreifen ist eine recht knifflige Angelegenheit und führt häufig zu mäßigen Ergebnissen. Wahrscheinlich lässt sich das Ganze mit einem eigenen View einfacher umsetzen.
    „Meine Komplikation hatte eine Komplikation.“
  • @MCDan das funktioniert leider nicht, das ist zwar generell interessant, aber es überdeckt ja immer die Views Rechts und Links. Ich will ja gerade das die auch angezeigt werden.

    Was ich mir jetzt überlegt habe, ich könnte ja auch einfach 3 ScrollViews neben einander bauen und bei allen Paging aktivieren. Wenn ich dann eine bewege, müssen die anderen beiden sich dem entsprechen einfach auch bewegen. Soviel zu Theorie.... schon am Ansatz scheitert es leider.

    Ich habe alle 3 ScrollViews im Code erstellt.

    PHP-Quellcode

    1. swDynamicSalesKitViewLeft = [[UIScrollView alloc]initWithFrame:CGRectMake(15, 283, 321, 465)];
    2. [swDynamicSalesKitViewLeft setScrollEnabled:YES];
    3. [swDynamicSalesKitViewLeft setAlwaysBounceHorizontal:YES];
    4. [swDynamicSalesKitViewLeft setAlwaysBounceVertical:NO];
    5. swDynamicSalesKitViewLeft.showsHorizontalScrollIndicator = NO;
    6. swDynamicSalesKitViewLeft.pagingEnabled = YES;
    7. swDynamicSalesKitViewLeft.delegate = self;
    8. swDynamicSalesKitViewLeft.backgroundColor = [UIColor blackColor];
    9. [self.view addSubview:swDynamicSalesKitViewLeft];
    10. swDynamicSalesKitViewCenter = [[UIScrollView alloc]initWithFrame:CGRectMake(351, 283, 321, 465)];
    11. [swDynamicSalesKitViewCenter setScrollEnabled:YES];
    12. [swDynamicSalesKitViewCenter setAlwaysBounceHorizontal:YES];
    13. [swDynamicSalesKitViewCenter setAlwaysBounceVertical:NO];
    14. swDynamicSalesKitViewCenter.showsHorizontalScrollIndicator = NO;
    15. swDynamicSalesKitViewCenter.pagingEnabled = YES;
    16. swDynamicSalesKitViewCenter.delegate = self;
    17. swDynamicSalesKitViewCenter.backgroundColor = [UIColor redColor];
    18. [self.view addSubview:swDynamicSalesKitViewCenter];
    19. swDynamicSalesKitViewRight = [[UIScrollView alloc]initWithFrame:CGRectMake(687, 283, 321, 465)];
    20. [swDynamicSalesKitViewRight setScrollEnabled:YES];
    21. [swDynamicSalesKitViewRight setAlwaysBounceHorizontal:YES];
    22. [swDynamicSalesKitViewRight setAlwaysBounceVertical:NO];
    23. swDynamicSalesKitViewRight.showsHorizontalScrollIndicator = NO;
    24. swDynamicSalesKitViewRight.pagingEnabled = YES;
    25. swDynamicSalesKitViewRight.delegate = self;
    26. swDynamicSalesKitViewRight.backgroundColor = [UIColor yellowColor];
    27. [self.view addSubview:swDynamicSalesKitViewRight];
    Alles anzeigen



    Das funktioniert so weit schon mal. (Die Einfärbung ist nur das ich sehen kann wo welche ist.)

    Nun will ich die alle einfach mit Views adden.

    PHP-Quellcode

    1. for (int i=0; i<[skList count]+2; i++) {
    2. UIView *uivSalesKit = [[UIView alloc]initWithFrame:CGRectMake(distanceFromX+(321*i), 45, 300, 400)];
    3. if (i == 0 || i == [skList count]+1) {
    4. }
    5. else {
    6. UILabel *lblTitle = [[UILabel alloc]initWithFrame:CGRectMake(48, 36, 173, 63)];
    7. lblTitle.numberOfLines = 2;
    8. lblTitle.textAlignment = UITextAlignmentLeft;
    9. lblTitle.backgroundColor = [UIColor clearColor];
    10. lblTitle.textColor = [UIColor whiteColor];
    11. lblTitle.font = [UIFont fontWithName:@"Helvetica" size:29];
    12. lblTitle.text = [skList objectAtIndex:i-1];
    13. [uivSalesKit addSubview:lblTitle];
    14. lblTitle = nil;
    15. }
    16. [swDynamicSalesKitViewLeft addSubview:uivSalesKit];
    17. [swDynamicSalesKitViewCenter addSubview:uivSalesKit];
    18. [swDynamicSalesKitViewRight addSubview:uivSalesKit];
    19. }
    Alles anzeigen



    Um den Code bisschen zu berkürzen adde ich nur ein Label in die View. Nun adde ich die View in den 3 ScrollViews. Er zeigt aber immer nur in der letzten ScrollView die Views an. Das verstehe ich allerdings nicht gnz.