我试图实现类似于新的Yahoo天气应用程序中所发现的效果。基本上,UIPageViewController
中的每个页面都具有背景图像,并且在滚动页面视图时,图像的位置仅滚动约一半的速度。我该怎么做呢? 我想我可以在UIPageViewController
中使用某种委托方法来获取当前偏移量,然后像那样更新图像。唯一的问题是,我找不到任何方法来判断UIPageViewController
是否正在滚动!有这方面的方法吗?谢谢!
我试图实现类似于新的Yahoo天气应用程序中所发现的效果。基本上,UIPageViewController
中的每个页面都具有背景图像,并且在滚动页面视图时,图像的位置仅滚动约一半的速度。我该怎么做呢? 我想我可以在UIPageViewController
中使用某种委托方法来获取当前偏移量,然后像那样更新图像。唯一的问题是,我找不到任何方法来判断UIPageViewController
是否正在滚动!有这方面的方法吗?谢谢!
for (UIView *view in self.pageViewController.view.subviews) {
if ([view isKindOfClass:[UIScrollView class]]) {
[(UIScrollView *)view setDelegate:self];
}
}
这将为您提供所有标准滚动视图API方法的访问权限。 并且不使用私有的Apple API。
我添加了遍历子视图的功能,以完全找到UIPageViewController
内部滚动视图
警告:
要小心使用scrollview.contentOffset。当控制器滚动到新页面时,它会重置。
如果您需要精确的scrollview
偏移跟踪等功能,最好使用UICollectionViewController
,其中单元格大小与集合视图本身相同,并启用分页。
我会这样做:
Objective-C
for (UIView *v in self.pageViewController.view.subviews) {
if ([v isKindOfClass:[UIScrollView class]]) {
((UIScrollView *)v).delegate = self;
}
}
并实现该协议
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
Swift
for view in self.pageViewController.view.subviews {
if let scrollView = view as? UIScrollView {
scrollView.delegate = self
}
}
并且实现这个协议
func scrollViewDidScroll(scrollView: UIScrollView)
extension UIPageViewController {
var scrollView: UIScrollView? {
return view.subviews.filter { $0 is UIScrollView }.first as? UIScrollView
}
}
使用:
pageController.scrollView?.delegate = self
for (UIView *v in self.pageViewController.view.subviews) {
if ([v isKindOfClass:[UIScrollView class]]) {
((UIScrollView *)v).delegate = self;
}
}
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
。-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGPoint point = scrollView.contentOffset;
float percentComplete;
percentComplete = fabs(point.x - self.view.frame.size.width)/self.view.frame.size.width;
NSLog(@"percentComplete: %f", percentComplete);
}
if let scrollView = self.pageViewController.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView {
scrollView.delegate = self
}
-[id<UIPageViewControllerDelegate> pageViewController:willTransitionToViewControllers:]
-[id<UIPageViewControllerDelegate> pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:]
使用这两种方法,您可以计算滚动的百分比(您应该将您的控制器存储在数组中,以便知道您滚动到哪个控制器并获取百分比)。
-[NSArray indexOfObject:]
获取搜索到的视图控制器的位置,然后进行一些基本的数学计算,以获取该索引相对于 -[NSArray count]
的百分比。 - Antonio E.-[UIPageViewController gestureRecognizers]
获取一个 UIPanGestureRecognizer
并使用它的方法来准确(且合法)地知道当前的移动情况。 - Antonio E.你不应该更改页面视图控制器滚动视图的委托:这可能会破坏其正常行为和/或在以后不受支持。
相反,你可以:
在页面视图控制器的视图中添加一个平移手势:
let panGesture = UIPanGestureRecognizer(target: self, action: #selector(panRecognized(gesture:)))
view.addGestureRecognizer(panGesture)
panGesture.delegate = self
添加新函数以了解视图如何滚动。
@objc func panRecognized(gesture: UIPanGestureRecognizer) {
// Do whatever you need with the gesture.translation(in: view)
}
将您的ViewController声明为UIGestureRecognizerDelegate
。
实现此函数:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
if([self.pageVC.view.subviews[1] respondsToSelector:@selector(setDelegate:)]){ [self.pageVC.view.subviews[1] setDelegate:self]; }
- Whoa