How can i change the page on clicking the dots of

2020-02-24 07:12发布

Here I have a pagecontrol which works good but on clicking on dot it doesn't change the page so please help in the function of changepage:

- (void)viewDidLoad {
    scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 420)];
    scrollView.delegate = self;
    [self.scrollView setBackgroundColor:[UIColor whiteColor]];
    [scrollView setCanCancelContentTouches:NO];
    scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
    scrollView.clipsToBounds = YES;
    scrollView.scrollEnabled = YES;
    [scrollView setShowsHorizontalScrollIndicator:NO];
    scrollView.pagingEnabled = YES;
    [self.view addSubview:scrollView];
    pageControl=[[UIPageControl alloc]initWithFrame:CGRectMake(0, 420, 320, 40)];
    [pageControl addTarget:self action:@selector(changepage:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:pageControl];

    UIView *blueView = [[UIView alloc] init];
    blueView.frame = CGRectMake(0, 0, 640, 480);
    blueView.backgroundColor = [UIColor whiteColor];
    [scrollView addSubview:blueView];
    self.pageControl.numberOfPages = 2;
    [scrollView setContentSize:CGSizeMake(640, 0)];
}

-(void)changepage:(id)sender
{
    int page = pageControl.currentPage;
    if (page < 0)
        return;
    if (page >= 2)
        return;
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    [scrollView scrollRectToVisible:frame animated:YES];

}

- (void)scrollViewDidScroll:(UIScrollView *)_scrollView
{
    if (pageControlIsChangingPage)
        return;
    CGFloat pageWidth = _scrollView.frame.size.width;
    int page = floor((_scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    pageControl.currentPage = page;
}

4条回答
成全新的幸福
2楼-- · 2020-02-24 07:26

You can create one event change page:

- (IBAction)changePage:(id)sender {
    UIPageControl *pager=sender;
    int page = pager.currentPage;
    CGRect frame = imageGrid_scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    [imageGrid_scrollView scrollRectToVisible:frame animated:YES];
}

Bind it to Pagecontrol's value changed event.

查看更多
乱世女痞
3楼-- · 2020-02-24 07:30

This is very useful for pagecontrol dots click action change page index for swift 3 and swift 4 .

@IBAction func pageControlSelectionAction(_ sender: UIPageControl) {
    let page: Int? = sender.currentPage
    var frame: CGRect = self.yourcollectionview.frame
    frame.origin.x = frame.size.width * CGFloat(page ?? 0)
    frame.origin.y = 0
    self.yourcollectionview.scrollRectToVisible(frame, animated: true)
}
查看更多
冷血范
4楼-- · 2020-02-24 07:41

Just to complete Banker Mittal's answer, the easiest way to do it in swift is to scroll the wanted rect to visible. You don't have to take care of "left" and "right" scrolling because iOS itself realizes which dot you tapped so you can just scroll to the correct frame:

private func moveScrollViewToCurrentPage() {

 //You can use your UICollectionView variable too instead of my scrollview variable
            self.scrollView
                .scrollRectToVisible(CGRect(
                    x: Int(self.scrollView.frame.size.width) * self.pager.currentPage,
                    y: 0,
                     width:Int(self.scrollView.frame.size.width),
                    height: Int(self.scrollView.frame.size.height)),
                                     animated: true)

    }
查看更多
姐就是有狂的资本
5楼-- · 2020-02-24 07:48

This is a Swift 2 Solution for UICollectionView. Clicking the UIPageControl's dots moves your current view to the left or to the right.

// Define bounds
private var currentIndex:Int = 0
private let maxLimit = 25
private let minLimit = 0

// Define @IBAction from UIPageControl
@IBAction func moveViewLeftRight(sender: UIPageControl) {
    // Move to Right
    if currentIndex < maxLimit && sender.currentPage > currentIndex {
        currentIndex++
        self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: currentIndex, inSection: 0), atScrollPosition: .Right, animated: true)
    // Move to Left
    } else if currentIndex > minLimit {
        currentIndex--
        self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: currentIndex, inSection: 0), atScrollPosition: .Left, animated: true)
    }
}
查看更多
登录 后发表回答