获取当前页面

时间:2010-11-09 11:14:56

标签: ios objective-c iphone cocoa-touch uiscrollview

在我的滚动视图中,我想获取正在显示的当前页面(可能页面不是正确的术语)。我找不到任何包含此变量的变量。但我认为它必须保留在某处,因为指示器能够显示当前正在显示滚动视图的哪个子视图。

这对我们是完全隐藏还是有办法让我访问它?

14 个答案:

答案 0 :(得分:255)

当前页面没有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;

答案 1 :(得分:30)

我建议您使用此代码

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
}

答案 2 :(得分:27)

在swift中我会扩展:

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

然后打电话:

scrollView.currentPage

答案 3 :(得分: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

答案 4 :(得分:6)

只需将当前偏移除以页面大小:

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

答案 5 :(得分:6)

这里有一些很好的答案。但是,对于内容不完全适合页面的情况 - 如果像我一样,您希望将结果用于UIPageControl,则必须使用ceil函数。

让我们举一个例子,我有“四个和一点”的内容页面。

我将基于我目前的现实生活中的例子。内容大小宽度为3140点。根据我的集合视图框架大小,页面宽度为728。

所以页数等于:

 3140 / 728 = 4.313 

我的numberOfPages将是五岁。其中四个将完整显示,最后一个 - 第五页 - 将显示剩余的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
}

答案 6 :(得分: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;
    }
}

答案 7 :(得分: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
    }
}

答案 8 :(得分:3)

另一种方式

func mergeAllDuplicates() -> CNContact {

    let duplicates: [Array<CNContact>] = //Array of Duplicates Contacts

    for item in duplicates {

        // CNCONTACT PROPERTIES

        var namePrefix: [String] = [String]()
        var givenName: [String] = [String]()
        var middleName: [String] = [String]()
        var familyName: [String] = [String]()
        var previousFamilyName: [String] = [String]()
        var nameSuffix: [String] = [String]()
        var nickname: [String] = [String]()
        var organizationName: [String] = [String]()
        var departmentName: [String] = [String]()
        var jobTitle: [String] = [String]()
        var phoneNumbers: [CNPhoneNumber] = [CNPhoneNumber]()
        var emailAddresses: [NSString] = [NSString]()
        var postalAddresses: [CNPostalAddress] = [CNPostalAddress]()
        var urlAddresses: [NSString] = [NSString]()

        var contactRelations: [CNContactRelation] = [CNContactRelation]()
        var socialProfiles: [CNSocialProfile] = [CNSocialProfile]()
        var instantMessageAddresses: [CNInstantMessageAddress] = [CNInstantMessageAddress]()

        // Filter
        for items in item {
            namePrefix.append(items.namePrefix)
            givenName.append(items.givenName)
            middleName.append(items.middleName)
            familyName.append(items.familyName)
            previousFamilyName.append(items.previousFamilyName)
            nameSuffix.append(items.nameSuffix)
            nickname.append(items.nickname)
            organizationName.append(items.organizationName)
            departmentName.append(items.departmentName)
            jobTitle.append(items.jobTitle)

            for number in items.phoneNumbers {
                phoneNumbers.append(number.value)
            }
            for email in items.emailAddresses {
                emailAddresses.append(email.value)
            }
            for postal in items.postalAddresses {
                postalAddresses.append(postal.value)
            }
            for url in items.urlAddresses {
                urlAddresses.append(url.value)
            }
            for relation in items.contactRelations {
                contactRelations.append(relation.value)
            }
            for social in items.socialProfiles {
                socialProfiles.append(social.value)
            }
            for message in items.instantMessageAddresses {
                instantMessageAddresses.append(message.value)
            }

        }

        let newContact = CNMutableContact()
        newContact.namePrefix = Array(Set(namePrefix))[0]
        newContact.givenName = Array(Set(givenName))[0]
        newContact.middleName = Array(Set(middleName))[0]
        newContact.familyName = Array(Set(familyName))[0]
        newContact.previousFamilyName = Array(Set(previousFamilyName))[0]
        newContact.nameSuffix = Array(Set(nameSuffix))[0]
        newContact.nickname = Array(Set(nickname))[0]
        newContact.organizationName = Array(Set(namePrefix))[0]
        newContact.departmentName = Array(Set(namePrefix))[0]
        newContact.jobTitle = Array(Set(namePrefix))[0]
        for item in Array(Set(phoneNumbers)) {
            newContact.phoneNumbers.append(CNLabeledValue(label: CNLabelHome, value: item))
        }
        for item in Array(Set(emailAddresses)) {
            newContact.emailAddresses.append(CNLabeledValue(label: CNLabelHome, value: item))
        }
        for item in Array(Set(postalAddresses)) {
            newContact.postalAddresses.append(CNLabeledValue(label: CNLabelHome, value: item))
        }
        for item in Array(Set(urlAddresses)) {
            newContact.urlAddresses.append(CNLabeledValue(label: CNLabelHome, value: item))
        }
        for item in Array(Set(contactRelations)) {
            newContact.contactRelations.append(CNLabeledValue(label: CNLabelHome, value: item))
        }
        for item in Array(Set(socialProfiles)) {
            newContact.socialProfiles.append(CNLabeledValue(label: CNLabelHome, value: item))
        }
        for item in Array(Set(instantMessageAddresses)) {
            newContact.instantMessageAddresses.append(CNLabeledValue(label: CNLabelHome, value: item))
        }

        return newContact

    }
}

答案 9 :(得分: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;
}

Full source here

答案 10 :(得分:2)

对于swift,我会使用这个

location ~ \.(php\|html)$ {

非常简单,它基本上采用scrollview x位置,将其除以滚动视图宽度,然后对其进行舍入。

答案 11 :(得分:1)

您使用的是UIPageControl吗?如果是,则具有currentPage属性。如果没有,我认为您需要从scrollView偏移量计算页面索引。

答案 12 :(得分: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应该会为您提供当前页面,并让您滚动到指定页面

答案 13 :(得分:0)

Swift 5.1+ UIScrollView扩展(省略return关键字)

extension UIScrollView {

    var currentPage: Int {
        Int(round(self.contentOffset.x / self.frame.width))
    }
}