web-dev-qa-db-ja.com

UIScrollViewのページを変更

10ページのUIScrollViewがあります。それらの間をフリックできます。また、タッチすると前または次のページに移動する2つのボタン([戻る]ボタンと[次へ]ボタン)が必要です。しかし、これを行う方法がわかりません。私のコードの多くは、Appleのページコントロールのサンプルコードから来ています。誰でも助けることができますか?

ありがとう

55
john

ページの場所までスクロールするようにボタンに指示するだけです。

CGRect frame = scrollView.frame;
frame.Origin.x = frame.size.width * pageNumberYouWantToGoTo;
frame.Origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
135
mjdth
scroll.contentOffset = CGPointMake(scroll.frame.size.width*pageNo, 0);
18
Mr.Guru.Patel

Swift 4の実装は次のとおりです。

func scrollToPage(page: Int, animated: Bool) {
    var frame: CGRect = self.scrollView.frame
    frame.Origin.x = frame.size.width * CGFloat(page)
    frame.Origin.y = 0
    self.scrollView.scrollRectToVisible(frame, animated: animated)
}

以下を呼び出すことで簡単に呼び出せます:

self.scrollToPage(1, animated: true)

編集:

これを行うためのより良い方法は、水平および垂直の両方のページネーションをサポートすることです。以下がそのための便利な拡張機能です。

extension UIScrollView {

    func scrollTo(horizontalPage: Int? = 0, verticalPage: Int? = 0, animated: Bool? = true) {
        var frame: CGRect = self.frame
        frame.Origin.x = frame.size.width * CGFloat(horizontalPage ?? 0)
        frame.Origin.y = frame.size.width * CGFloat(verticalPage ?? 0)
        self.scrollRectToVisible(frame, animated: animated ?? true)
    }

}

これにより、UIScrollViewに拡張機能が作成され、任意のページ(垂直または水平)にスクロールできます。

self.scrollView.scrollTo(horizontalPage: 0)
self.scrollView.scrollTo(verticalPage: 2, animated: true)
self.scrollView.scrollTo(horizontalPage: 1, verticalPage: 2, animated: true)
16
Pontus

scrollRectToVisibleが機能していなかったため、contentOffsetをアニメーション化する必要がありました。このコードはSwift 3。

func scrollToPage(_ page: Int) {
    UIView.animate(withDuration: 0.3) { 
        self.scrollView.contentOffset.x = self.scrollView.frame.width * CGFloat(page)
    }
}
13
Chuy47

Swiftの場合、これは非常に便利な拡張機能です。

extension UIScrollView {
    func scrollToPage(index: UInt8, animated: Bool, after delay: TimeInterval) {
        let offset: CGPoint = CGPoint(x: CGFloat(index) * frame.size.width, y: 0)
        DispatchQueue.main.asyncAfter(deadline: .now() + delay, execute: {
            self.setContentOffset(offset, animated: animated)
        })
    }
}

そして、あなたはこれを次のように呼び出します:

scrollView.scrollToPage(index: 1, animated: true, after: 0.5)
8
David Hernandez

まず、次のようなUIScrollView拡張機能を作成します。

extension UIScrollView {

    func setCurrentPage(position: Int) {
        var frame = self.frame;
        frame.Origin.x = frame.size.width * CGFloat(position)
        frame.Origin.y = 0
        scrollRectToVisible(frame, animated: true)
    }

}

それからちょうど電話してください:

self.scrollView.setCurrentPage(position: 2)  // where 2 is your desired page

この方法でそれを行うことができます:

CGRect lastVisibleRect;
CGSize contentSize = [_scrollView contentSize];
lastVisibleRect.size.height = contentSize.height; 
lastVisibleRect.Origin.y = 0.0; 
lastVisibleRect.size.width = PAGE_WIDTH; 
lastVisibleRect.Origin.x  = contentSize.width - PAGE_WIDTH * (_totalItems - pageIndex); // total item of scrollview and your current page index

[_scrollView scrollRectToVisible:lastVisibleRect animated:NO];
2
HSG

Swiftの静的メソッドは次のとおりです。

static func scrollToPage(scrollView: UIScrollView, page: Int, animated: Bool) {
    var frame: CGRect = scrollView.frame
    frame.Origin.x = frame.size.width * CGFloat(page);
    frame.Origin.y = 0;
    scrollView.scrollRectToVisible(frame, animated: animated)
}
2
maxhud

ScrollRectToVisibleが機能しない場合は、これを試してください:

let frame = scrollView.frame
    let offset:CGPoint = CGPoint(x: CGFloat(sender.currentPage) * frame.size.width, y: 0)
    self.scrollView.setContentOffset(offset, animated: true)
0
giLisH

迅速なソリューション

func changePage(pageControl: UIPageControl) {

    let page = CGFloat(pageControl.currentPage)
    var frame = self.scrollView.frame
    frame.Origin.x = frame.size.width * page
    frame.Origin.y = 0
    self.scrollView.scrollRectToVisible(frame, animated: true)
}
0