답변:
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
메서드는 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
}
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);
}
이 getter 및 Setter는 현재 페이지를 제공하고 지정된 페이지로 스크롤 할 수 있도록합니다.
UIScrollViewDelegate
사용자가 스크롤 할 때 현재 페이지를 가져 오기 위해 를 사용하는 것을 잊지 마십시오 !