回答:
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
}
迅速に私は拡張してそれを行います:
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
メソッドは最終Xオフセットを2412にします。
丸め計算の適用:
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
}
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
}
}
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;
}
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);
}
このゲッターとセッターは現在のページを提供し、指定したページにスクロールできるようにする必要があります
UIScrollViewDelegate
ユーザーがスクロールしたときに、を使用して現在のページを取得することを忘れないでください。