UIPageViewController和故事板 [英] UIPageViewController and storyboard

查看:91
本文介绍了UIPageViewController和故事板的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试从故事板中特定配置UIPageViewController:





TutorialPageViewController.h

  #import< UIKit / UIKit.h> 
@interface TutorialPageViewController:UIPageViewController< UIPageViewControllerDelegate,UIPageViewControllerDataSource>
@end

TutorialPageViewController.m

  #importTutorialPageViewController.h

@interface TutorialPageViewController()
@ property(assign,nonatomic)NSInteger索引;
@end

@implementation TutorialPageViewController
{
NSArray * myViewControllers;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil ]。
if(self){
//自定义初始化
}
返回self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
//加载视图后进行任何其他设置。
self.delegate = self;
self.dataSource = self;
[self didMoveToParentViewController:self];
UIStoryboard * tutorialStoryboard = [UIStoryboard storyboardWithName:@TutorialStoryboardbundle:[NSBundle mainBundle]];
UIViewController * tuto1 = [tutorialStoryboard instantiateViewControllerWithIdentifier:@TutorialPageViewController_1];
UIViewController * tuto2 = [tutorialStoryboard instantiateViewControllerWithIdentifier:@TutorialPageViewController_2];

myViewControllers = @ [tuto1,tuto2,tuto1,tuto2];
self.index = 0;

[self setViewControllers:@ [tuto1] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index {
return myViewControllers [index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

NSUInteger index = self.index;

if(index == 0){return nil; }

//将索引减1以返回
index--;
return [self viewControllerAtIndex:index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

NSUInteger index = self.index;
index ++;
if(index> [myViewControllers count]){return nil; }

return [self viewControllerAtIndex:index];
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
//页面指示符中反映的项目数。
return [myViewControllers count];
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
//页面指示器中反映的所选项目。
返回0;
}

@end



问题是......




  • 第一页显示页面指示符。在刷卡时,

  • 我可以正确看到第二页。

  • 转换完成后,我会看到一个黑屏(带有页面指​​示器正确显示页码2)。没有用户
    互动可用。


解决方案

2017年答案..



现在很容易做到这一点只使用故事板



这种刷全屏教程在一段时间内作为应用程序的介绍很受欢迎,因此我将该课程称为 IntroPages



步骤1,创建一个UIPageViewController的容器视图。



如果是iOS的新手,这里是)



你可以做t容器你想要的任何形状。与任何容器视图一样,它可以是全屏或屏幕的一小部分 - 无论你想要什么。



第2步,



制作四个简单的视图控制器,可以你想要的任何东西 - 图像,文本,表格,任何东西。 (示例中为紫色。)





请注意,他们只是坐在你的故事板上,不要将它们链接到任何东西。



步骤3,您必须设置这四个页面的ID 。 id1,id2,id4,id4没问题。





步骤4,复制并粘贴!这是类IntroPages,

 类IntroPages:UIPageViewController,UIPageViewControllerDataSource,UIPageViewControllerDelegate {

var pages = [ UIViewController]()

覆盖func viewDidLoad(){
super.viewDidLoad()
self.delegate = self
self.dataSource = self

让p1:UIViewController! = storyboard?.instantiateViewController(withIdentifier:id1)
let p2:UIViewController! = storyboard?.instantiateViewController(withIdentifier:id2)
let p3:UIViewController! = storyboard?.instantiateViewController(withIdentifier:id3)

// etc ...

pages.append(p1)
pages.append(p2)
pages.append(p3)

//等...

setViewControllers([p1],direction:UIPageViewControllerNavigationDirection.forward,animated:false,completion: nil)
}

func pageViewController(_ pageViewController:UIPageViewController,viewControllerBefore viewController:UIViewController) - >的UIViewController? {

让cur = pages.index(of:viewController)!

//如果您不想循环滚动,只需在此添加:
//如果cur == 0 {return nil}

let prev = abs( (cur - 1)%pages.count)
返回页面[上一页]

}

func pageViewController(_ pageViewController:UIPageViewController,viewControllerAfter viewController:UIViewController) - >的UIViewController? {

让cur = pages.index(of:viewController)!

//如果您不想循环滚动,只需在此添加:
//如果cur ==(pages.count - 1){return nil}

let nxt = abs((cur + 1)%pages.count)
返回页面[nxt]
}

func presentationIndex(对于pageViewController:UIPageViewController) - > Int {
return pages.count
}
}

(看看评论 - 你可以选择循环或线性分页的代码。)



这就是它的全部 - 你已经完成了。



您只需在故事板上设置过渡样式,





您很可能想要滚动,而不是另一个。


I'm trying to configure a UIPageViewController SPECIFICALLY from storyboard:

TutorialPageViewController.h

#import <UIKit/UIKit.h>
@interface TutorialPageViewController : UIPageViewController <UIPageViewControllerDelegate, UIPageViewControllerDataSource>
@end

TutorialPageViewController.m

#import "TutorialPageViewController.h"

@interface TutorialPageViewController ()
@property (assign, nonatomic) NSInteger index;
@end

@implementation TutorialPageViewController
{
    NSArray *myViewControllers;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.delegate = self;
    self.dataSource = self;
    [self didMoveToParentViewController:self];
    UIStoryboard *tutorialStoryboard = [UIStoryboard storyboardWithName:@"TutorialStoryboard" bundle:[NSBundle mainBundle]];
    UIViewController *tuto1 = [tutorialStoryboard instantiateViewControllerWithIdentifier:@"TutorialPageViewController_1"];
    UIViewController *tuto2 = [tutorialStoryboard instantiateViewControllerWithIdentifier:@"TutorialPageViewController_2"];

    myViewControllers = @[tuto1, tuto2, tuto1, tuto2];
    self.index = 0;

    [self setViewControllers:@[tuto1] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
}

- (UIViewController *)viewControllerAtIndex:(NSUInteger)index {
    return myViewControllers[index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {

    NSUInteger index = self.index;

    if (index == 0) { return nil; }

    // Decrease the index by 1 to return
    index--;
    return [self viewControllerAtIndex:index];
}

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {

    NSUInteger index = self.index;
    index++;
    if (index > [myViewControllers count]) { return nil; }

    return [self viewControllerAtIndex:index];
}

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController {
    // The number of items reflected in the page indicator.
    return [myViewControllers count];
}

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController {
    // The selected item reflected in the page indicator.
    return 0;
}

@end

Problem is...

  • The first page displays well with the page indicator. While swiping,
  • I can see properly the second page.
  • As soon as the transition finishes, I get a black screen (with the page indicator properly displaying page number 2). No user interaction is available anymore.

解决方案

2017 answer..

Nowadays it is dead easy to do this simply using Storyboard.

These sort of "swiping full-screen tutorials" were popular as "intros" to an app for awhile, so I called the class below IntroPages.

Step 1, make a container view that is a UIPageViewController.

If new to iOS, here is a container view tutorial.

( Note: if you don't know how to change the container view to a UIPageViewController, scroll down to the section "How to change..." on that tutorial.

)

You can make the container any shape you want. As with any container view, it can be full-screen or a small part of the screen - whatever you want.

Step 2,

Make four straightforward view controllers which can be anything you want - images, text, tables, anything at all. (Purple in the example.)

Note that they simply sit there on your storyboard, do not link them to anything.

Step 3, you must Set the IDs of those four pages. "id1", "id2", "id4", "id4" is fine.

Step 4, copy and paste! Here's the class IntroPages,

class IntroPages: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

    var pages = [UIViewController]()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
        self.dataSource = self

        let p1: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id1")
        let p2: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id2")
        let p3: UIViewController! = storyboard?.instantiateViewController(withIdentifier: "id3")

        // etc ...

        pages.append(p1)
        pages.append(p2)
        pages.append(p3)

        // etc ...

        setViewControllers([p1], direction: UIPageViewControllerNavigationDirection.forward, animated: false, completion: nil)
    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController)-> UIViewController? {

        let cur = pages.index(of: viewController)!

        // if you prefer to NOT scroll circularly, simply add here:
        // if cur == 0 { return nil }

        let prev = abs((cur - 1) % pages.count)
        return pages[prev]

    }

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController)-> UIViewController? {

        let cur = pages.index(of: viewController)!

        // if you prefer to NOT scroll circularly, simply add here:
        // if cur == (pages.count - 1) { return nil }

        let nxt = abs((cur + 1) % pages.count)
        return pages[nxt]
    }

    func presentationIndex(for pageViewController: UIPageViewController)-> Int {
        return pages.count
    }
}

(Look at the comments - there is code for either looping or linear paging as you prefer.)

That's all there is to it - you're done.

You simply set the transition style on the storyboard,

it is very likely that you want "Scroll", not the other one.

这篇关于UIPageViewController和故事板的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆