Programing

현재 페이지 얻기

crosscheck 2020. 8. 26. 07:22
반응형

현재 페이지 얻기


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

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


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

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

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

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

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

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

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

 3140 / 728 = 4.313 

My numberOfPages is going to be five. Four of which will show in entirety, and the last of which - page five - will show that remaining 0.313 of content.

Now, numberOfPages being five means that the page indices will be 0, 1, 2, 3, and 4.

When I swipe rightwards, paging towards the final offset, the scrollViewDidEndDecelerating method gives a final X offset of 2412.

Applying the rounding calculation:

2412 / 728 = 3.313 then rounded = 3

That's incorrect. Page user is viewing by offset should be:

Offset / Page User Is Viewing
0        0
728      1
1456     2
2184     3
2412     4

The correct calculation using 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
}

Another way:

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

In xCode 7.x swift 2.x you can do :

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

The solution of Aoakenfo is amazing, this is another solution combining your code with the function scrollViewDidScroll and 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;
    }
}

For swift I would just use this

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

Pretty straightforward, it basically takes the scrollview x position, divides it by the scrollview width, then rounds it.


I extracted this out of a couple of our apps...

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

Full source here


Are you using a UIPageControl? If so, this has a currentPage property. If not, I think you'll need to calculate the page index from the scrollView offset.


If Any one Looking for way of doing in C# for Xamarin

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

This getter and Setter should provide you current page as well let you scroll to the specified page

참고URL : https://stackoverflow.com/questions/4132993/getting-the-current-page

반응형