【问题标题】:swiping right, the page control's current page changes but the dots don't向右滑动,页面控件的当前页面会发生变化,但点不会
【发布时间】:2014-11-01 08:56:39
【问题描述】:

我用一些相关的图像创建了一个教程,并在上面添加了一个页面控件。此外,我添加了一个滑动手势,它通过更改图片来响应。在下面的代码中,定义了一个 switch case,以便根据滑动的方向(左/右)决定下一个应该是哪个图像和点。

- (IBAction)handleSwipe:(UISwipeGestureRecognizer *)sender
{
//    NSLog(@"swiped");
    NSArray *images;

    if (self.selectedRow == 0) {
        images = [[NSArray alloc] initWithObjects:@"w8.JPG",@"w7.JPG",@"w6.JPG",@"w5.JPG",@"w4.JPG",@"w3.JPG", @"w2.JPG", @"w1.JPG" ,@"w9.JPG", nil];

        self.pageControl.hidden = NO;
        [self.pageControl setNumberOfPages:9];

        UISwipeGestureRecognizerDirection direction = [(UISwipeGestureRecognizer *) sender direction];

        switch (direction) {
            case UISwipeGestureRecognizerDirectionRight:
                if (pageController == 0 || imageIndex == 8)
                {
                    self.Oops = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"You cannot swipe to the left, there are not any previous steps." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
                    [self.Oops show];
                }
                else {
                    [self.pageControl setCurrentPage:pageController - 1];
                    pageController = pageController - 1;
                }
                imageIndex++;
                break;
            case UISwipeGestureRecognizerDirectionLeft:
                if (pageController < 8 && pageController >= 0) {
                    [self.pageControl setCurrentPage:pageController];
                    pageController = pageController + 1;
                }
                else {
                    [self.pageControl setCurrentPage: pageController ];
                    pageController = 0;
                }
                imageIndex--;
                break;
            default:
                break;
        }
        NSLog(@"pagecontroller is %li and imageIndex is %li " , pageController, imageIndex);
        imageIndex = (imageIndex < 0) ? ([images count] - 1): imageIndex % [images count];
        self.imageView.image = [UIImage imageNamed:[images objectAtIndex:imageIndex]];
    }

正如您在代码中看到的,有一个 NSLog;当我运行该应用程序时,一切正常,但是当我向右滑动以查看上一张图像时,尽管 NSLog 显示点和图像的所有索引都正确更改并且我们看到了上一张图像,但点并没有改变。再次向右滑动,点会发生变化,但为时已晚,因为必须分类的图像和点的顺序变得无序,例如最后一张图像与第一个点一起显示。 我确信我的算法是正确的,因为我用那个 NSLog 检查了它,而且在向右滑动之前一切正常。 有什么想法吗?

我稍微改了一下代码:

 switch (direction) {
            case UISwipeGestureRecognizerDirectionRight:
                if (pageController != 0 && imageIndex != 9) {
                    [self.pageControl setCurrentPage:(pageController - 1)];
                    pageController --;
                    imageIndex++;
                }
                break;
            case UISwipeGestureRecognizerDirectionLeft:
                if (pageController <= 8 && pageController >= 0) {
                    [self.pageControl setCurrentPage:pageController];
                    pageController = pageController + 1;
                    imageIndex--;
                }
                break;
            default:
                break;
        }

现在唯一的问题是,当我向不同方向滑动时,页面控件会计算当前点两次。

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    您的 imageIndex++imageIndex-- 行放错了位置。 (例如,如果 pageController 已经为 0,您可能不想更改图像)。将它们移至:

    - (IBAction)handleSwipe:(UISwipeGestureRecognizer *)sender
    {
    //    NSLog(@"swiped");
        NSArray *images;
        
        if (self.selectedRow == 0) {
            images = [[NSArray alloc] initWithObjects:@"w8.JPG",@"w7.JPG",@"w6.JPG",@"w5.JPG",@"w4.JPG",@"w3.JPG", @"w2.JPG", @"w1.JPG" ,@"w9.JPG", nil];
            
            self.pageControl.hidden = NO;
            [self.pageControl setNumberOfPages:9];
            
            UISwipeGestureRecognizerDirection direction = [(UISwipeGestureRecognizer *) sender direction];
            
            switch (direction) {
                case UISwipeGestureRecognizerDirectionRight:
                    if (pageController == 0 || imageIndex == 8)
                    {
                        self.Oops = [[UIAlertView alloc] initWithTitle:@"Oops!" message:@"You should turn over to the left." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
                        [self.Oops show];
                    }
                    else {
                        [self.pageControl setCurrentPage:pageController - 1];
                        pageController = pageController - 1;
                        imageIndex++;
                    }
                    break;
                case UISwipeGestureRecognizerDirectionLeft:
                    if (pageController < 8 && pageController >= 0) {
                        [self.pageControl setCurrentPage:pageController];
                        pageController = pageController + 1;
                        imageIndex--;
                    }
                    else {
                        [self.pageControl setCurrentPage: pageController ];
                        pageController = 0;
                    }
                    break;
                default:
                    break;
            }
            NSLog(@"pagecontroller is %li and imageIndex is %li " , pageController, imageIndex);
            imageIndex = (imageIndex < 0) ? ([images count] - 1): imageIndex % [images count];
            self.imageView.image = [UIImage imageNamed:[images objectAtIndex:imageIndex]];
        }

    在您修改后的代码中,我认为您需要以不同的方式设置页面控件(到 pageController+1)以向左滑动:

    switch (direction) {
            case UISwipeGestureRecognizerDirectionRight:
                if (pageController != 0 && imageIndex != 9) {
                    [self.pageControl setCurrentPage:(pageController - 1)];
                    pageController --;
                    imageIndex++;
                }
                break;
            case UISwipeGestureRecognizerDirectionLeft:
                if (pageController <= 8 && pageController >= 0) {
                    [self.pageControl setCurrentPage:pageController+1];
                    pageController = pageController + 1;
                    imageIndex--;
                }
                break;
            default:
                break;
        }
    

    【讨论】:

    • 我做到了。不仅存在问题,而且如果我们只向左滑动,每次到达末尾时,最后一张图像都会到达第一个点。 @pbasdf
    • pageController 和 imageIndex 的起始值是多少?
    • imageIndex 为 8,pageController 为 0。@pbasdf
    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 2020-10-14
    • 2015-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多