Answers:
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
功能至关重要。
让我们举一个例子,其中我有“四位”内容页面。
我将基于当前的现实生活示例。内容大小宽度为3140点。根据我的收藏夹视图框架的大小,页面宽度为728。
因此页数等于:
3140 / 728 = 4.313
我numberOfPages
要五岁了。其中四个将完整显示,最后一个-第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);
}
此getter和Setter应该会为您提供当前页面,并让您滚动到指定页面
UIScrollViewDelegate
当用户滚动时,请不要忘记使用来获取当前页面!