현재 페이지 얻기


97

내 스크롤보기에서 현재 표시되는 페이지를 가져오고 싶습니다 (페이지가 올바른 용어가 아닐 수 있음). 이것을 보유하는 변수를 찾을 수 없습니다. 그러나 인디케이터는 현재 스크롤 뷰의 어떤 하위 뷰가 표시되고 있는지 보여줄 수 있기 때문에 어딘가에 있어야한다고 생각합니다.

이것이 우리에게 완전히 숨겨져 있습니까? 아니면 제가 접근 할 수있는 방법이 있습니까?

답변:


263

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;

7
UIScrollViewDelegate사용자가 스크롤 할 때 현재 페이지를 가져 오기 위해 를 사용하는 것을 잊지 마십시오 !
Sam Spencer

회전을 처리 할 때 문제가있을 수 있습니다.
Jason McCreary 2013

신속한 버전을 추가하십시오
fnc12 2015-06-25

1
이것은 항상 작동하는 것은 아니며 때로는 프레임 너비가 잘못되었습니다.
Rodrigo Ruiz

이것은 항상 작동하지 않습니다. 때때로 나는 내 경우에 잘못된 페이지를 0으로 얻습니다.
Sneha

32

이 코드를 사용하는 것이 좋습니다.

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
}

iOS7 장치에서 작동하지 않음 (XCODE 6.2로 컴파일 됨) contentOffset.x는 scrollViewDidEndDecelerating시 640이 아닌 639입니다 (이유를 묻지 마십시오 ...). user363349 대답이 맞습니다 : return floor ((self.contentOffset.x-pageWidth / 2) / pageWidth) + 1;
Vassily 2015

이것은 항상 작동하지 않습니다. 때때로 나는 내 경우에 잘못된 페이지를 0으로 얻습니다.
Sneha

30

신속하게 확장하여 수행합니다.

extension UIScrollView {
    var currentPage:Int{
        return Int((self.contentOffset.x+(0.5*self.frame.size.width))/self.frame.width)+1
    }
}

그런 다음 전화하십시오.

scrollView.currentPage

10
거의 완벽합니다. 모든 것이 제 세계에 기반을두고 있기 때문에 마지막에 +1을 제거해야했습니다
mvandillen

12

위와 같지만 카테고리로


@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

6
그것은 과장되었습니다. return round (self.contentOffset.x / self.frame.size.width); 훨씬 간단하고 이해하기 쉽습니다.
Leonard Pauli

-1 @LeonardPauli. 위의 구현은 50 % 이상 보이는 페이지를 반환합니다. 순진한 구현은 scrollview의 subview가 전체 scrollview 경계를 차지할 때만 페이지 값을 변경합니다.
사용자

1
@user 첫째, floor ()는 항상 내림하고, round ()는 소수 부분이> = 5이면 올림하고 그렇지 않으면 내림합니다. 즉, floor (a) = round (a-0.5). 간단한 대수를 해봅시다. floor ((ab / 2) / b) +1 = 바닥 (a / b-0.5) +1 = 원형 (a / b-0.5-0.5) +1 = 원형 (a / b-1) +1 = 원형 ( a / b). 보기! floor ((ab / 2) / b) +1 = round (a / b)처럼 보입니다! 수학적.
Leonard Pauli 2014 년

그러나 그래, 내가 어떤 이유로 바닥을 대신 사용했다면 당신은 완벽하게 옳았을 것입니다! ;)
Leonard Pauli 2014 년

8

다른 방법 :

extension MyViewController: UIScrollViewDelegate {
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        let width = scrollView.frame.width
        let page = Int(round(scrollView.contentOffset.x/width))
        print("CurrentPage:\(page)")
    }
}

6

현재 오프셋을 페이지 크기로 나눕니다.

CGFloat pageNum = (int)(scrollView.contentOffset.x / scrollView.frame.size.width);

11
int로 캐스팅 한 다음 float에 할당 하시겠습니까? 왜뿐만 아니라 pageNum의 INT하지)
클라스

6

여기에 이미 좋은 답변이 있습니다. 그러나 내용이 페이지에 정확하게 맞지 않는 시나리오 - 나 같은 당신이의 결과를 사용하려는 경우 UIPageControl, 다음은 사용하는 것이 중요합니다 ceil기능을.

"4 개 및 약간의"콘텐츠 페이지가있는 예를 들어 보겠습니다.

나는 현재의 실제 사례를 기반으로 할 것입니다. 콘텐츠 크기 너비는 3140 포인트입니다. 내 컬렉션 뷰 프레임 크기에 따라 페이지 너비는 728입니다.

따라서 페이지 수는 다음과 같습니다.

 3140 / 728 = 4.313 

나는 numberOfPages5 살이 될 것입니다. 그중 4 개는 전체가 표시되고 나머지 5 페이지는 나머지 0.313콘텐츠를 표시합니다 .

이제 numberOfPages5라는 것은 페이지 인덱스가 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
}

4

신속하게 나는 이것을 사용합니다

    let width = scrollView.frame.width
    let page = round(scrollView.contentOffset.x/width)

매우 간단합니다. 기본적으로 scrollview x 위치를 가져 와서 scrollview 너비로 나눈 다음 반올림합니다.


3

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
    }
}

3

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

1
이것은 게으르지 않고 탐욕 스럽습니다. 또한 MVC가 아닙니다. 훨씬 간단한 방법이있는 UIScrollView의 하위 클래스 또는 범주에서 모든 ... 스크롤에 currentPage을 무효화하고,이 요청 유일의 때를 설정하는 것입니다

2

몇 개의 앱에서 추출했습니다.

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

여기에 전체 소스


1

UIPageControl을 사용하고 있습니까? 그렇다면 currentPage속성이 있습니다. 그렇지 않다면 scrollView 오프셋에서 페이지 인덱스를 계산해야한다고 생각합니다.


0

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);
    }

이 getter 및 Setter는 현재 페이지를 제공하고 지정된 페이지로 스크롤 할 수 있도록합니다.


0

Swift 5.1+ UIScrollView 확장 (return 키워드 생략)

extension UIScrollView {

    var currentPage: Int {
        Int(round(self.contentOffset.x / self.frame.width))
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.