Tutorial iOS – Criando uma UIPageViewController com StoryBoard

On 13 de maio de 2014 by Conrado Carneiro

No tutorial de hoje iremos falar da classe UIPageViewController, muito utilizada em diversas situações. Sua função é manter em apenas uma view, diversos conteúdos, bastando apenas deslizar os dedos para os lados para mudar o tipo de conteúdo. A seguir uma imagem que exemplifica a sua utilização.

Captura de Tela 2014-05-07 às 23.49.09

A Classe UIPageViewController é altamente configurável, podemos definir:
– a orientação das pages view: vertical ou horizontal
– o estilo da transição: transição de rolagem ou transição de folhear um livro.
– o espaço entre as páginas: apenas pode ser alterado quando o modo de transição for rolagem.

Bom, vamos criar um simples projeto para demonstrar como o UIPageViewController funciona.

Vamos começar!!

Criando um Projeto:

Abra o XCode, selecione as opções conforme informado a seguir:

Captura de Tela 2014-05-08 às 00.00.58

A seguir, defina o nome do projeto conforme desejado, no nosso caso defini como PageControl.

Captura de Tela 2014-05-08 às 00.02.11

Criando a Page View Controller na Storyboard

Agora, selecione Main.storyboard e adicione uma View Controller e uma Page View Controller, pasta isso basta arrastar a opção no menu a esquerda, conforme indicado com a seta.

Captura de Tela 2014-05-08 às 00.07.03

Após adicionar a View Controller e a Page ViewController o resutado deverá ser similar a imagem a seguir:

Captura de Tela 2014-05-08 às 00.07.58Agora, selecione a Page View Controller e no menu a direita faça as seguintes modificações:

Clique no terceiro ícone: Identify Inspector conforme indicado na seta e em seguida preencha os campos indicados: em Storyboard ID coloque: PageViewController.

Captura de Tela 2014-05-08 às 00.35.22

Já no quarto ícone indicado, que corresponde a tela de Attributes Inspector vá no item Transition Style coloque Scroll, conforme indicado nas setas abaixo:

Captura de Tela 2014-05-08 às 00.36.14

Feito isso, vamos adicionar uma Label ao ViewController e um botão chamado “Começar de novo”

Captura de Tela 2014-05-13 às 22.22.30

Criando a  Classe ViewController

A próxima etapa é criar a classe que iremos associar ao ViewController que adicionamos a Label e o Botão na etapa anterior. Para isso vá no Menu: File -> New -> New File  e escolha a opção “Objective-C Class” nos templates. Defina o nome como PageContentViewController e em seguida volte a StoryBoard selecione o menu Identify Inspector da ViewController em questão e defina o nome da Classe com o mesmo nome do arquivo criado, aproveite também para definir o StoryBoard ID o resultado será o seguinte:

Captura de Tela 2014-05-13 às 22.27.50

Vamos agora adicionar a Label e o Botão adicionados na StoryBoard ao código, no arquivo PageContentViewController.h, para isso basta habilitar o modo Assistant Editor, repare nas setas indicando como habilitar esse modo e qual arquivo deverá estar selecionado.

Captura de Tela 2014-05-13 às 22.29.44

Agora é fácil com a tecla control pressionada clique nos itens na storyBoard e arraste uma seta até o código na tela da direita. Ao arrastar o botão por exemplo, um balão será exibido e as configurações deverão ser iguais a indicadas na imagem abaixo:

Captura de Tela 2014-05-13 às 22.32.07

Além disso, precisaremos declarar as seguintes variáveis:
NSString para atribuir o texto a label
NSUInteger para identificar a pagina selecionada
NSArray para armazenar o conteúdo

por fim, precisaremos criar um objeto do tipo UIPageViewController, e adicionar o seu Procotolo de Delegate para controlar os movimentos, nosso arquivo ViewController.h ficará assim:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
#import <UIKit/UIKit.h>

@interface PageContentViewController : UIViewController <UIPageViewControllerDataSource>

@property NSUInteger pageIndex;
@property NSString *titleText;
@property (weak, nonatomic) IBOutlet UILabel *labelText;
@property (nonatomic, retain) NSArray *titleLabel;
@property (nonatomic, retain) UIPageViewController *pageViewController;
– (IBAction)comecar:(UIButton *)sender;

@end
[/sourcecode]

Como adicionamos o Protocolo UIPageViewControllerDataSource teremos que implementar três funções, além disso deveremos popular a Array com o contéudo que será exibido, por tanto o  arquivo ViewController.m terá as seguintes modificações

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
– (void)viewDidLoad
{
[super viewDidLoad];
self.titleArray = @[@"Pagina 1", @"segunda Pagina", @"Terceira", @"4"];
}
[/sourcecode]

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
#pragma mark – Page View Controller Data Source

– (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;

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

index–;
return [self viewControllerAtIndex:index];
}

– (UIViewController *)pageViewController:(UIPageViewController *)pageViewController
viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;

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

index++;
if (index == [self.titleArray count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}

– (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
if (([self.titleArray count] == 0) || (index >= [self.titleArray count])) {
return nil;
}

// Create a new view controller and pass suitable data.
PageContentViewController *pageContentViewController;
pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.titleText = self.titleArray[index];
pageContentViewController.pageIndex = index;

return pageContentViewController;
}
[/sourcecode]

Outras duas funções serão fundamentais, a primeira para indicar quantas páginas teremos e a segunda para informar qual a primeira página a ser exibida:

[sourcecode language=”objc” wraplines=”false” collapse=”false”]

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
    return [self.pageTitles count];
}

– (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
    return 0;
}

[/sourcecode]

Para inicializar o pageControl adicione o seguinte código a ViewDidLoad da ViewController.m

[sourcecode language=”objc” wraplines=”false” collapse=”false”]

self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    self.pageViewController.dataSource = self;
    // inicializa a pageViewController
    PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
    NSArray *viewControllers = @[startingViewController];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
   
    // muda o tamanho da page view controller
    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height – 30);
   
    [self addChildViewController:_pageViewController];
    [self.view addSubview:_pageViewController.view];
    [self.pageViewController didMoveToParentViewController:self];
[/sourcecode]

Para alterar as cores do controlador de página basta acrescentar o seguinte código no arquivo AppDelegate.m na função, alterando as cores que achar conveniente: didFinishLaunchingWithOptions

[sourcecode language=”objc” wraplines=”false” collapse=”false”]
UIPageControl *pageControl = [UIPageControl appearance];
pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.backgroundColor = [UIColor whiteColor];
[/sourcecode]

Pronto, basta compilar o projeto e o resultado obtido será igual o da imagem a seguir:

Captura de Tela 2014-05-13 às 23.16.15

2 Responses to “Tutorial iOS – Criando uma UIPageViewController com StoryBoard”

  • Bom tutorial.
    Mas uma dúvida, para sair do UIPageViewController, e passar a navegação para o “App propriamente dito” como faço?

    Pois a idéia seria chamar este elemento somente a primeira vez que o app é executado, ou quando o user vai até alguma tela de Opções e pede para ver o tutoria novamente.

  • Obrigado pelo tutorial porem, não achei muito claro a parte do “
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
    {
    return [self.pageTitles count];
    }

    Nao meu xcode fica um aviso em vermelho falando que eu não declarei o pageTitles, mas realmente não foi declarado porque no tutorial não há nada falando desta propriedade. esse pageTitle seria o que?

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *