Jan*_*Jan 88 iphone ios uipageviewcontroller
你怎么知道里面显示的当前页面/视图是UIPageViewController
什么?
我已经覆盖了viewDidAppear
我的子视图的方法,因此他们在viewDidAppear
方法中向父视图发送了一个id .
但问题是:我无法可靠地将该id用作显示页面的id.因为如果用户转动页面但中途决定停止转动并将页面放回,viewDidAppear
则已经被调用.(视图在卷曲页面后面可见).
也许我应该只在当前视图消失的情况下切换到新的id.但我想知道是否有更简单的方法来返回当前可见的视图?
Ole*_*ann 101
您应该手动跟踪当前页面.委托方法pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:
将告诉您何时更新该变量.该方法的最后一个参数transitionCompleted:
可以告诉您用户是否完成了翻页过渡.
Edd*_*rja 58
从iOS 6开始,我发现viewControllers
UIPageViewController 的属性不断更新,因此它将始终保存一个代表当前页面的视图控制器,而不是其他内容.因此,您可以通过调用viewControllers[0]
(假设您一次只显示一个视图控制器)来访问当前页面.
只有在页面"锁定"到位时,viewController数组才会更新,因此如果用户决定部分显示下一页,则除非他们完成转换,否则它不会成为"当前"页面.
如果要跟踪"页码",请在通过UIPageViewController数据源方法创建视图控制器时为其分配索引值.
例如:
-(void)autoAdvance
{
UIViewController *currentVC = self.viewControllers[0];
NSUInteger currentIndex = [myViewControllers indexOfObject:currentVC];
if ( currentIndex >= (myViewControllers.count-1) ) return;
[self setViewControllers:@[myViewControllers[ currentIndex+1 ]]
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:nil];
}
-(NSInteger)presentationIndexForPageViewController:
(UIPageViewController *)pageViewController
{
// return 0;
UIViewController *currentVC = self.viewControllers[0];
NSUInteger currentIndex = [myViewControllers indexOfObject:currentVC];
return currentIndex;
}
Run Code Online (Sandbox Code Playgroud)
但请注意这是不可靠的评论.
Vic*_*tor 45
不幸的是,以上所有方法都没有帮助我.不过,我通过使用标签找到了解决方案.可能它不是最好的,但它有效,并希望它可以帮助某人:
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (completed) {
int currentIndex = ((UIViewController *)self.pageViewController.viewControllers.firstObject).view.tag;
self.pageControl.currentPage = currentIndex;
}
}
Run Code Online (Sandbox Code Playgroud)
在Swift :(感谢@Jessy)
func pageViewController(pageViewController: UIPageViewController,
didFinishAnimating finished: Bool,
previousViewControllers: [UIViewController],
transitionCompleted completed: Bool)
{
guard completed else { return }
self.pageControl.currentPage = pageViewController.viewControllers!.first!.view.tag
}
Run Code Online (Sandbox Code Playgroud)
示例: gist
Cor*_*oyd 35
以Ole的答案为基础......
这就是我实现4种方法来跟踪当前页面并将页面指示器更新为正确索引的方法:
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController{
return (NSInteger)[self.model count];
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController{
return (NSInteger)self.currentIndex;
}
- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers{
SJJeanViewController* controller = [pendingViewControllers firstObject];
self.nextIndex = [self indexOfViewController:controller];
}
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
if(completed){
self.currentIndex = self.nextIndex;
}
self.nextIndex = 0;
}
Run Code Online (Sandbox Code Playgroud)
sir*_*ine 31
下面的解决方案对我有用.
通过使本机UIPageViewController滚动视图分页更加可配置,Apple可以避免许多麻烦.我不得不求助于覆盖新的UIView和UIPageControl只是因为本机UIPageViewController分页不支持透明背景或在视图框架内重新定位.
- (void)pageViewController:(UIPageViewController *)pvc didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (!completed)
{
return;
}
NSUInteger currentIndex = [[self.pageViewController.viewControllers lastObject] index];
self.pageControl.currentPage = currentIndex;
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*vic 18
斯威夫特4
没有不必要的代码 这样做的3种方法.使用UIPageViewControllerDelegate方法.
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
guard completed else { return }
// using content viewcontroller's index
guard let index = (pageViewController.viewControllers?.first as? ContentViewController)?.index else { return }
// using viewcontroller's view tag
guard let index = pageViewController.viewControllers?.first?.view.tag else { return }
// switch on viewcontroller
guard let vc = pageViewController.viewControllers?.first else { return }
let index: Int
switch vc {
case is FirstViewController:
index = 0
case is SecondViewController:
index = 1
default:
index = 2
}
}
Run Code Online (Sandbox Code Playgroud)
Wah*_*Haq 11
我通过使用一个小函数并将pageIndex指定为静态NSInteger来跟踪页面索引.
-(void) setPageIndex
{
DataViewController *theCurrentViewController = [self.pageViewController.viewControllers objectAtIndex:0];
pageIndex = [self.modelController indexOfViewController:theCurrentViewController];
}
Run Code Online (Sandbox Code Playgroud)
并且[self setPageIndex];
在Ole指定的函数内部调用,并且在检测到方向的变化之后.
我第一次使用Corey的解决方案,但它不能在iOS5上工作,然后最终使用,
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed{
if(completed) {
_currentViewController = [pageViewController.viewControllers lastObject];
}
}
Run Code Online (Sandbox Code Playgroud)
它尝试切换不同的页面,现在效果很好.
归档时间: |
|
查看次数: |
79178 次 |
最近记录: |