关于这个tutorial by AppCoda about how to implement a app with UIPageViewController我想在页面顶部而不是在底部使用自定义页面控制元素。
当我只将页面控制元素放在将要显示的单个视图的顶部时,逻辑结果是控件元素随着页面视图滚动而远离屏幕。
如何将控制元素置于视图顶部以使页面视图全屏(如图像),以便用户可以看到固定控件元素下的视图?
我附上了一个示例屏幕截图 - 信用额AppCoda and Path:
答案 0 :(得分:51)
经过进一步调查和搜索I found a solution后,还在stackoverflow上。
密钥是要发送到自定义UIPageControl
元素的以下消息:
[self.view bringSubviewToFront:self.pageControl];
The AppCoda tutorial is the foundation for this solution:
使用箭头在UIPageControl
- 视图控制器顶部添加RootViewController
元素。
在IBOutlet
中创建相关的ViewController.m
元素。
在viewDidLoad
方法中,您应该添加以下代码作为添加所有子视图后调用的最后一种方法。
[self.view bringSubviewToFront:self.pageControl];
要根据当前内容视图的pageIndex分配当前页面,您可以将以下内容添加到UIPageViewControllerDataSource
方法中:
- (UIPageViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
// ...
index--;
[self.pageControl setCurrentPage:index];
return [self viewControllerAtIndex:index];
}
- (UIPageViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
// ...
index++;
[self.pageControl setCurrentPage:index];
// ...
return [self viewControllerAtIndex:index];
}
答案 1 :(得分:50)
我没有让代表对发起这个问题的答案发表评论,但我真的很喜欢。我改进了代码并将其转换为swift,用于UIPageViewController的下面的子类:
class UIPageViewControllerWithOverlayIndicator: UIPageViewController {
override func viewDidLayoutSubviews() {
for subView in self.view.subviews as! [UIView] {
if subView is UIScrollView {
subView.frame = self.view.bounds
} else if subView is UIPageControl {
self.view.bringSubviewToFront(subView)
}
}
super.viewDidLayoutSubviews()
}
}
清洁,效果很好。无需维护任何内容,只需将您的页面视图控制器作为故事板中此类的实例,或者使您的自定义页面视图控制器类继承此类。
答案 2 :(得分:27)
sn3ek你的回答让我大部分都在那里。我没有使用viewControllerCreation
方法设置当前页面。
我让ViewController also
成为UIPageViewController
的代表。然后我在该方法中设置PageControl
' s CurrentPage
。使用pageIndex
维护原始文章中ContentViewController
提及的内容。
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
APPChildViewController *currentViewController = pageViewController.viewControllers[0];
[self.pageControl setCurrentPage:currentViewController.pageIndex];
}
请勿忘记将其添加到viewDidLoad
self.pageViewController.delegate = self;
要跟进PropellerHead的评论,ViewController
的界面将具有
@interface ViewController : UIViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate>
答案 3 :(得分:3)
只需通过子类化UIPageViewController并覆盖viewDidLayoutSubviews,即可实现相同的效果,如下所示:
-(void)viewDidLayoutSubviews {
UIView* v = self.view;
NSArray* subviews = v.subviews;
if( [subviews count] == 2 ) {
UIScrollView* sv = nil;
UIPageControl* pc = nil;
for( UIView* t in subviews ) {
if( [t isKindOfClass:[UIScrollView class]] ) {
sv = (UIScrollView*)t;
} else if( [t isKindOfClass:[UIPageControl class]] ) {
pc = (UIPageControl*)t;
}
}
if( sv != nil && pc != nil ) {
// expand scroll view to fit entire view
sv.frame = v.bounds;
// put page control in front
[v bringSubviewToFront:pc];
}
}
[super viewDidLayoutSubviews];
}
然后没有必要保持单独的UIPageControl等。
答案 4 :(得分:2)
这是我查看其他回复后放在一起的RxSwift / RxCocoa答案。
if ( Input.GetAxis("Mouse ScrollWheel") > 0) {
transform.Translate(Vector3.forward * Time.deltaTime * 10000f * scrollAxis, Space.Self );
initialPosition = transform.position;
}
答案 5 :(得分:1)
您必须实现自定义UIPageControl
并将其添加到视图中。正如其他人所提到的,必须调用view.bringSubviewToFront(pageControl)
。
我有一个example视图控制器,其中包含使用UIPageControl
设置自定义UIPageViewController
(在故事板中)的所有代码
您需要实现两种方法来设置当前页面指示符。
func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {
pendingIndex = pages.indexOf(pendingViewControllers.first!)
}
func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
if completed {
currentIndex = pendingIndex
if let index = currentIndex {
pageControl.currentPage = index
}
}
}
答案 6 :(得分:0)
这是基于@ zerotool上面回答的Swifty 2答案。只需将UIPageViewController子类化,然后添加此覆盖以查找scrollview并调整其大小。然后抓住页面控件并将其移动到其他所有内容的顶部。您还需要将页面控件背景颜色设置为清除。最后两行可以放在您的app委托中。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var sv:UIScrollView?
var pc:UIPageControl?
for v in self.view.subviews{
if v.isKindOfClass(UIScrollView) {
sv = v as? UIScrollView
}else if v.isKindOfClass(UIPageControl) {
pc = v as? UIPageControl
}
}
if let newSv = sv {
newSv.frame = self.view.bounds
}
if let newPc = pc {
self.view.bringSubviewToFront(newPc)
}
}
let pageControlAppearance = UIPageControl.appearance()
pageControlAppearance.backgroundColor = UIColor.clearColor()
顺便说一句 - 我没有注意到任何无限循环,如上所述。