スクロールビューで、表示されている現在のページを取得します(ページは正しい用語ではない可能性があります)。これを保持する変数が見つかりません。しかし、スクロールビューのどのサブビューが現在表示されているかをインジケーターが示すことができるため、どこかに保持する必要があると思います。
これは完全に私たちから隠されていますか、または私がそれにアクセスする方法はありますか?
現在のページにはUIScrollView
プロパティがありません。以下で計算できます:
int page = scrollView.contentOffset.x / scrollView.frame.size.width;
最も近いページに切り上げまたは切り捨てる場合は、次を使用します。
CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
このコードを使用することをお勧めします
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
ただし、このコードを使用する場合、indexOfPageが提供するページ上にビューを正確に配置する必要はありません。このメソッドでのみこのコードを使用することもお勧めしているためです
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{}
これはscrollViewがスクロールを終了したときに呼び出され、ページの番号を非常にシャープにします
このコードでscrollViewをページ対応に設定することをお勧めします
[scrollView setPagingEnabled:YES];
最後にそのように見えるはずです
-(void) methodWhereYouSetYourScrollView
{
//set scrollView
[scrollView setPagingEnabled:YES];
scrollView.delegate = self;
}
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int indexOfPage = scrollView.contentOffset.x / scrollView.frame.size.width;
//your stuff with index
}
In Swift私は拡張でそれをします:
extension UIScrollView {
var currentPage:Int{
return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
}
}
それから電話してください:
scrollView.currentPage
上記と同じですが、カテゴリとして
@interface UIScrollView (CurrentPage)
-(int) currentPage;
@end
@implementation UIScrollView (CurrentPage)
-(int) currentPage{
CGFloat pageWidth = self.frame.size.width;
return floor((self.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
}
@end
ここにはすでにいくつかの良い答えがあります。ただし、コンテンツがページに正確に収まらないシナリオの場合-私のようにUIPageControl
の結果を使用する場合は、ceil
関数を使用することが不可欠です。
「4ビット」のコンテンツページがある例を見てみましょう。
これは、現在の実生活の例に基づいています。コンテンツサイズの幅は3140ポイントです。コレクションビューのフレームサイズに基づいて、ページ幅は728です。
したがって、ページ数は次のとおりです。
3140 / 728 = 4.313
私のnumberOfPages
は5になります。そのうち4つは完全に表示され、最後の5ページは残りの0.313
のコンテンツ。
現在、numberOfPages
が5であるということは、ページインデックスが0、1、2、3、および4になることを意味します。
最終オフセットに向かってページングして右にスワイプすると、scrollViewDidEndDecelerating
メソッドは2412の最終Xオフセットを提供します。
丸め計算の適用:
2412 / 728 = 3.313 then rounded = 3
それは間違っています。オフセットでユーザーが表示しているページは次のようになります。
Offset / Page User Is Viewing
0 0
728 1
1456 2
2184 3
2412 4
ceil
を使用した正しい計算:
private func pageForOffset(offset:CGFloat, pageWidth width:CGFloat) -> Int
{
let page = Int(ceil(offset / width))
NSLog("\(__FUNCTION__) offset \(offset) width \(width) page \(page) ")
return page
}
現在のオフセットをページサイズで除算するだけです。
CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);
別の方法:
extension MyViewController: UIScrollViewDelegate {
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let width = scrollView.frame.width
let page = Int(round(scrollView.contentOffset.x/width))
print("CurrentPage:\(page)")
}
}
XCode 7.x Swift 2.xでは次のことができます。
//MARK: - ScrollView Extensions
// Get the current page number
extension UIScrollView {
var currentPage: Int {
return Int(round(self.contentOffset.x / self.bounds.size.width))
}
// If you have reversed offset (start from contentSize.width to 0)
var reverseCurrentPage: Int {
return Int(round((contentSize.width - self.contentOffset.x) / self.bounds.size.width))-1
}
}
Swift私はこれを使うだけです
let width = scrollView.frame.width
let page = round(scrollView.contentOffset.x/width)
かなり簡単です。基本的には、スクロールビューのx位置を取得し、スクロールビューの幅で割ってから丸めます。
Aoakenfoのソリューションは素晴らしいです。これは、コードと関数scrollViewDidScrollおよびPageControllerを組み合わせた別のソリューションです。
- (void)scrollViewDidScroll:(UIScrollView *)sender {
if (sender == self.scroll) {
int pageNum = (int)(self.scrPage.contentOffset.x / self.scrPage.frame.size.width);
self.pagecontroller.currentPage =pageNum;
}
}
これをいくつかのアプリから抽出しました...
- (NSInteger)currentPage
{
if (0 == self.frame.size.width) {
NSLog(@"frame width == 0!");
return 0;
}
if (! self.currentPageValid) {
_currentPage = round(self.contentOffset.x / self.frame.size.width);
self.currentPageValid = YES;
}
return _currentPage;
}
UIPageControlを使用していますか?その場合、これにはcurrentPage
プロパティがあります。そうでない場合、scrollViewオフセットからページインデックスを計算する必要があると思います。
XamarinのC#で行う方法を探している方
public int CurrentIndex
{
get => (int)Math.Round(this.scrollView.ContentOffset.X / this.scrollView.Frame.Width);
set => this.scrollView.ScrollRectToVisible(new CGRect(new CGPoint(this.scrollView.Frame.Size.Width * value, 0), this.scrollView.Frame.Size), true);
}
このゲッターとセッターは、現在のページを提供するだけでなく、指定されたページにスクロールできるようにする必要があります