首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >UIPageViewController的研究进展

UIPageViewController的研究进展
EN

Stack Overflow用户
提问于 2014-03-22 20:59:30
回答 7查看 10.1K关注 0票数 15

我希望在页面滚动过程中从uipageviewcontroller接收更新。我想知道%中的transitionProgress。(当用户移动手指以转到另一个页面时,该值应更新)。我感兴趣的是从一页到另一页的动画进度,而不是总页数的进度。

到目前为止,我发现的是:

  • 有一个名为UICollectionViewTransitionLayout的类,它的属性与我正在寻找的"transitionProgress“相对应。也许uipageviewcontroller以某种方式实现了这个方法?
  • 我可以在uipageviewcontroller上调用下面的方法,但我只能得到0的结果!

percentComplete; = CGFloat percentComplete = self.pageViewController.transitionCoordinator

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-03-23 23:14:53

最后,我找到了一个解决方案,尽管这可能不是最好的方法:

我首先在滚动视图上添加一个观察者,如下所示:

// Get Notified at update of scrollview progress
NSArray *views = self.pageViewController.view.subviews;
UIScrollView* sW = [views objectAtIndex:0];
[sW addObserver:self forKeyPath:@"contentOffset" options:NSKeyValueObservingOptionNew context:NULL];

当观察者被调用时:

NSArray *views = self.pageViewController.view.subviews;
UIScrollView* sW = [views objectAtIndex:0];
CGPoint point = sW.contentOffset;

float percentComplete;
//iPhone 5
if([ [ UIScreen mainScreen ] bounds ].size.height == 568){
    percentComplete = fabs(point.x - 568)/568;

} else{
//iphone 4
    percentComplete = fabs(point.x - 480)/480;
}
NSLog(@"percentComplete: %f", percentComplete);

我很高兴我找到了这个:-)

票数 4
EN

Stack Overflow用户

发布于 2016-05-22 07:11:59

在SWIFT中复制粘贴;)非常适合我

extension UIPageViewController: UIScrollViewDelegate {

    public override func viewDidLoad() {
        super.viewDidLoad()

        for subview in view.subviews {
            if let scrollView = subview as? UIScrollView {
                scrollView.delegate = self
            }
        }
    }

   public func scrollViewDidScroll(_ scrollView: UIScrollView) {
       let point = scrollView.contentOffset
       var percentComplete: CGFloat
       percentComplete = abs(point.x - view.frame.size.width)/view.frame.size.width
       print("percentComplete: ",percentComplete)
   }
}
票数 23
EN

Stack Overflow用户

发布于 2014-05-06 05:58:14

由于我认为滚动的功能将永远存在,但内部实现可能会更改为滚动视图以外的其他功能,因此我找到了下面的解决方案(我没有对此进行过太多测试,但仍然如此)

NSUInteger offset = 0;
UIViewController * firstVisibleViewController;
while([(firstVisibleViewController = [self viewControllerForPage:offset]).view superview] == nil) {
  ++offset;
}
CGRect rect = [[firstVisibleViewController.view superview] convertRect:firstVisibleViewController.view.frame fromView:self.view];
CGFloat absolutePosition = rect.origin.x / self.view.frame.size.width;
absolutePosition += (CGFloat)offset;

(self在这里是UIPageViewController[-viewControllerForPage:]是返回给定页面上的视图控制器的方法)

如果absolutePosition为0.0f,则显示第一个视图控制器,如果等于1.0f,则显示第二个视图控制器,依此类推。这可以在CADisplayLink中与委托方法和/或UIPanGestureRecognizer一起重复调用,以有效地了解UIPageViewController的当前进度的状态。

编辑:使其适用于任意数量的视图控制器

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22577929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档