web-dev-qa-db-ja.com

UIPageControlのドットをクリックしてページを変更するにはどうすればよいですか

ここに私はうまく機能するページコントロールがありますが、ドットをクリックしてもページは変更されませんので、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;
}
37
Vivek Sehrawat

1つのイベント変更ページを作成できます。

- (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];
}

Pagecontrolの値変更イベントにバインドします。

60
Banker Mittal

これはSwift 3および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)
}
5
Maulik Patel

Banker Mittalの答えを完成させるために、Swiftでそれを行う最も簡単な方法は、必要なrectを目に見えるようにスクロールすることです。「左」と「右」のスクロールの世話をする必要はありませんiOS自体は、タップしたドットを認識しているため、正しいフレームにスクロールするだけです。

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)

    }
4
Fry

これはSwift 2UICollectionViewのソリューションです。 UIPageControl's dotsは、現在のビューを左または右に移動します。

// 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)
    }
}
2
fatihyildizhan