Desenvolvendo para iOS
       com CocoaTouch
Sumário
• Documentação

• Principais ferramentas de uso

• Objective-C / Cocoa touch

• Novidades do IOS 5

• Design e imagens

• Animações e edições de imagens

• Rastreando o usuário
Documentação
  O primeiro grande passo
Documentação
• https://developer.apple.com/library/ios/ipad/#home
Documentação
• https://github.com/brunogb/DocSets-for-iOS
Documentação
• HIG - Human interface guidelines
Principais ferramentas
Xcode
Xcode


• Edição do código

• Construção da interface

• Ferramenta de depuração de código

• Modelador de banco de dados
Xcode
Editor de versão do código



Suporte:
Interface Builder?
Interface Builder
Interface Builder



 • IBOutlets e IBActions diretamente da interface
Instruments
Instruments


• Avaliação de performance, gargálos, memory leaks

• Automação de navegação pelo aplicativo

• Facilita encontrar bugs de programação

• Analisador de OpenGL
Instruments
Instruments
Instruments
Objective-C
Sintaxe
Sintaxe
ARC
Automatic Reference Counting
ARC
Automatic Reference Counting




• Não utilize os métodos dealloc, retain e release

• Para arquivos que não devam ser compilados com ARC, utilize a flag
  <-fno-objc-arc>

• Todos os métodos da sua classe devem estar especificados na
  interface
ARC
Automatic Reference Counting
ARC
Automatic Reference Counting




      @autoreleasepool {
          <seu código>
      }
Usando blocos com Objective-C
   E quais as vantagens em se utilizar blocos
Usando blocos com Objective-C




     Blocos são objetos que encapsulam um
      segmento de código a ser executado.
Usando blocos com Objective-C




   Adotado cada vez mais nos novos frameworks
Usando blocos com Objective-C


  Como remover uma view com fade
Usando blocos com Objective-C


   Transição "Flip" entre views
Definindo blocos
Definindo blocos
https://github.com/brunogb/BlocksKit


BlocksKit adiciona o suporte a blocos em diversos
frameworks que ainda não tem esse suporte
• Filtros em arrays e dicionários

• Alertas e ActionSheets

• Timers

• Conexões de internet

• Reconhecimento de gestos
Executando tarefas em background
 "nunca execute tarefas longas na thead principal"
Executando tarefas em background



           Tarefas com processamento paralisam a
          interface gráfica e passam a sensação de
            que o aplicativo não esta funcionando


- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
Executando tarefas em background



      Tarefas com processamento paralisam a
     interface gráfica e passam a sensação de
       que o aplicativo não esta funcionando


     - (void)performSelectorOnMainThread:(SEL)aSelector
     withObject:(id)arg waitUntilDone:(BOOL)wait
Novidades do iOS 5
Novos métodos, frameworks, e possibilidades
NSJSONSerialization
Traduzindo e gerando dados no formato JSON

+ (id)JSONObjectWithData:(NSData *)data options:
(NSJSONReadingOptions)opt error:(NSError **)error;

+ (id)JSONObjectWithStream:(NSInputStream *)stream
options:(NSJSONReadingOptions)opt error:(NSError **)error;

+ (BOOL)isValidJSONObject:(id)obj;

+ (NSData *)dataWithJSONObject:(id)obj options:
(NSJSONWritingOptions)opt error:(NSError **)error;
UIKit
UIScreen
    Controlando o brilho da tela


@property (nonatomic) CGFloat brightness;



@property (nonatomic) BOOL wantsSoftwareDimming;
 ( Cuidado com essa propriedade, ela pode causar uma
       animação mais lenta se estiver habilitada )
UIScrollview
Controlando o ponto de parada de um scroll



- (void)scrollViewWillEndDragging:(UIScrollView *)sv
withVelocity:(CGPoint)vel
targetContentOffset:(inout CGPoint *)tCO;

 ( a variável tCO contem o possível ponto de parada da
scrollView, e você pode altera-lo para o ponto que achar
melhor. Cuidado para não estraga a "física" da scrollView,
              ou o usuário pode ficar perdido)
UIReferenceLibraryViewController
Exibindo definições de palavras

- (id)initWithTerm:(NSString *)term;

+ (BOOL)dictionaryHasDefinitionForTerm:(NSString *)term;
UITableView
Registrando UITableViewCell com um identifier

- (void)registerNib:(UINib *)nib
forCellReuseIdentifier:(NSString *)ident;



Como recuperar um Nib


    UINib *nibFile = [UINib nibWithNibName:@"MyNib" bundle:nil];


( Importante definir na UITableViewCell o mesmo identifier )
UIImage
Imagens animadas

+ (UIImage*)animatedImageNamed:(NSString *)name duration:
(NSTimeInterval)duration;
Busca por name0, name1....


+ (UIImage*)animatedImageWithImages:(NSArray *)images
duration:(NSTimeInterval)duration;

@property (nonatomic, readonly) NSArray *images;

@property (nonatomic, readonly) NSTimeInterval duration;
UIImage
Imagens redimencionadas (tiles)


- (UIImage*)resizableImageWithCapInsets:(UIEdgeInsets)i;
duration:(NSTimeInterval)duration;




                            {0, 1, 0, 1}
UIViewControllerContainer
UIViewControllerContainer
Container



- (void)addChildViewController:(UIViewController *)cvc;

- (void)removeFromParentViewController;

@property (readonly) BOOL childViewControllers;


Após executar o método <addChildViewController:> deve-se este método no
controllers adicionado:

- (void)didMoveToParentViewController:(UIViewController *)cvc;
UIViewControllerContainer
Transição entre controllers




- (void)transitionFromViewController:(UIViewController *)fvc
toViewController:(UIViewController *)tvc
duration:(NSTimeInterval)duration
options:(UIViewAnimationOptions)options
animations:(void (^)(void))animations
completion:(void (^)(BOOL finished))completion;
UIStepper
Controle para aumentar ou diminuir um valor

@property (nonatomic) BOOL autorepeat;

@property (nonatomic) double maximumValue;

@property (nonatomic) double minimumValue;

@property (nonatomic) double stepValue;

@property (nonatomic) double value;
Twitter & Accounts
     "Single sign-on"
Twitter & Accounts
    "Single sign-on"

TWRequest;

Responsável por efetuar requisições para a API do Twitter. Caso
seja um recurso protegido, basta definir a propriedade <account>.
 

 Saiba os métodos disponíveis em: http://dev.twitter.com/docs/api



TWTweetComposeViewController

ViewController que permite ao usuário enviar um tweet. Pode ser
adicionado uma imagem, ou url ao tweet antes de exibi-lo.
Twitter & Accounts
 "Single sign-on"




Código para recuperar todas as contas disponíveis
UIStoryBoards
UIStoryBoards




Fácil de criar e visualizar a navegação do aplicativo
UIStoryBoard
UIViewController

@property (readonly, retain) UIStoryBoard *storyboard;

- (void)performSegueWithIdentifier:(NSString *)id sender:
(id)sender;

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:
(id)sender;

- (void)instantiateViewControllerWithIdentifier:(NSString *)identifier
UIStoryBoard
UITableViewController




                        Protótipo de células de
                        tabelas dentro da própria
                        tabela
UIStoryBoard
UITableViewController




                        Tabelas com conteúdo
                        estático pre definido
Sincronização remota em tempo
      real entre aplicativos
Configurando iCloud
 em seu aplicativo
• Habilitar o provisioning profile com permissão para
  iCloud

• Atualizar provisioning profile no Xcode

• Marcar o campo <entitlements> dentro do summary do
  aplicativo
Configurando iCloud
 em seu aplicativo
Configurando iCloud
 em seu aplicativo
Newsstand
Revistas e jornais no seu iDevice
Newsstand
Revistas e jornais no seu iDevice




• Possibilita download de conteúdo em background

• Possibilita que o aplicativo seja lançado em
  background via push notification

• Possibilita downloads de itens separados do servidor
  em background.

• Ícone do aplicativo pode ser alterado para refletir a
  última edição recebida.
Animações e edição básica de imagens
 Utilizando QuartzCore, CoreAnimation e CoreImage
CALayer
Toda UIView tem uma CALayer responsável por desenhar
o conteúdo na tela. Seus atributos podem ser animados




Para acessar a layer de uma UIView:

    UIView *view = [[UIView alloc] init];
    CALayer *layer = view.layer;
CALayer                          • cornerRadius


Deixa a view com borda arredondada.
Caso a view possua conteúdos perto da
borda, pode ser necessário utilizar a
propriedade <clipToBounds> da view
para que o conteúdo seja escondido


    UIView *view = [[UIView alloc] init];
    CALayer *layer = view.layer;
    layer.cornerRadius = 8;
CALayer                        • borderColor, borderWidth


Define cor e tamanho da borda da view.
Acompanha o traçado do cornerRadius,
se houver. A cor é definida com uma
referencia do tipo CGColorRef.


    UIView *view = [[UIView alloc] init];
    CALayer *layer = view.layer;
    layer.borderWidth = 3;
    layer.borderColor = [UIColor redColor].CGColor;
CALayer                       • shadowOpacity, shadowRadius,
                                shadowOffset, shadowColor


Define opacidade, radius, offset e cor da
sombra da UIView. O offset é definido
como um CGSize e determina a partir
do centro da view para qual direção a
sombra vai se deslocar.

    UIView *view = [[UIView alloc] init];
    CALayer *layer = view.layer;
    layer.shadowOpacity = 0.8;
    layer.shadowColor = [UIColor redColor].CGColor;
    layer.shadowRadius = 2;
    layer.shadowOffset = CGSizeMake(0,1);
Design e imagens
Design e imagens
Regra dos 44x44 pixels




     A área mínima de um controle que aceite um
           toque deve ser de 44x44 pixels.
Design e imagens
Regra dos 44x44 pixels
Design e imagens
Regra dos 44x44 pixels




    UINavigationBar tem 44px de altura, e apesar
    de seus botões interior terem 30px de altura,
    sua área de toque é estendida para os 44px
Design e imagens
Tamanho dos ícones do aplicativo


• AppStore: 512x512px

• iPad: 72x72px

• Home screen: 57x57px

• Home screen (Retina display): 114x114px
Design e imagens
Tamanho da tela e desenvolvendo para tela Retina


• iPhone: 320x480

• iPad: 768x1024

• IPhone Retina: 640x960
Importante notar que para desenvolver para tela retina basta multiplicar por 2
o tamanho do objeto numa tela não retina. Ex: uma imagem 50x50 em tela
normal, em tela retina seria 100x100. E para utilizar imagens em retina, basta
ela ter o mesmo nome da normal acrescentada de @2x antes da extensão.
Design e imagens
Tamanho dos elementos internos


• Status bar: 20px de altura

• Navigation bar: 44px de altura

• Tab bar: 49px de altura

• Bar itens: 30x30 pixels
Rasteando o usuário
dentro do aplicativo
  Aprendendo com o usuário o que mais
   importante e o que funciona melhor
Rasteando o usuário dentro do aplicativo


 As melhores ferramentas disponíveis no momento
 são Google analytics e Flurry.
 
 Ambas são muito parecidas em termos de
 funcionalidades mas cada uma se destaca em
 uma área.
Flurry
• Analytics para iOS, Android, Blackberry, Windows Phone,
  JavaME, HTML5.

• Rastreia dados como sexo do usuário, idade e ID (desde
  que esses dados sejam fornecidos pelo programador)

• Relatórios são mais simples porém.


Google analytics
• Analytics para iOS, Android e HTML.

• Rastreia dados customizados definidos pelo
  desenvolvidor

• Integração com ecommerce, e campanhas. Versão web

• Relatórios detalhados, mesmo painel da versão web.
Mais informações
Bruno Bilescky

bruno.gondim@telefonicadigital.com.br

brunogb@gmail.com

@bgondim


Documentação 

http://developer.apple.com
Desenvolvendo para iOS com Cocoa-Touch

Desenvolvendo para iOS com Cocoa-Touch

  • 1.
  • 2.
    Sumário • Documentação • Principaisferramentas de uso • Objective-C / Cocoa touch • Novidades do IOS 5 • Design e imagens • Animações e edições de imagens • Rastreando o usuário
  • 3.
    Documentação Oprimeiro grande passo
  • 4.
  • 5.
  • 6.
    Documentação • HIG -Human interface guidelines
  • 7.
  • 8.
  • 9.
    Xcode • Edição docódigo • Construção da interface • Ferramenta de depuração de código • Modelador de banco de dados
  • 10.
    Xcode Editor de versãodo código Suporte:
  • 11.
  • 12.
  • 13.
    Interface Builder •IBOutlets e IBActions diretamente da interface
  • 14.
  • 15.
    Instruments • Avaliação deperformance, gargálos, memory leaks • Automação de navegação pelo aplicativo • Facilita encontrar bugs de programação • Analisador de OpenGL
  • 16.
  • 17.
  • 18.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
    ARC Automatic Reference Counting •Não utilize os métodos dealloc, retain e release • Para arquivos que não devam ser compilados com ARC, utilize a flag <-fno-objc-arc> • Todos os métodos da sua classe devem estar especificados na interface
  • 25.
  • 26.
    ARC Automatic Reference Counting @autoreleasepool { <seu código> }
  • 27.
    Usando blocos comObjective-C E quais as vantagens em se utilizar blocos
  • 28.
    Usando blocos comObjective-C Blocos são objetos que encapsulam um segmento de código a ser executado.
  • 29.
    Usando blocos comObjective-C Adotado cada vez mais nos novos frameworks
  • 30.
    Usando blocos comObjective-C Como remover uma view com fade
  • 31.
    Usando blocos comObjective-C Transição "Flip" entre views
  • 32.
  • 33.
    Definindo blocos https://github.com/brunogb/BlocksKit BlocksKit adicionao suporte a blocos em diversos frameworks que ainda não tem esse suporte • Filtros em arrays e dicionários • Alertas e ActionSheets • Timers • Conexões de internet • Reconhecimento de gestos
  • 34.
    Executando tarefas embackground "nunca execute tarefas longas na thead principal"
  • 35.
    Executando tarefas embackground Tarefas com processamento paralisam a interface gráfica e passam a sensação de que o aplicativo não esta funcionando - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
  • 36.
    Executando tarefas embackground Tarefas com processamento paralisam a interface gráfica e passam a sensação de que o aplicativo não esta funcionando - (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait
  • 37.
    Novidades do iOS5 Novos métodos, frameworks, e possibilidades
  • 38.
    NSJSONSerialization Traduzindo e gerandodados no formato JSON + (id)JSONObjectWithData:(NSData *)data options: (NSJSONReadingOptions)opt error:(NSError **)error; + (id)JSONObjectWithStream:(NSInputStream *)stream options:(NSJSONReadingOptions)opt error:(NSError **)error; + (BOOL)isValidJSONObject:(id)obj; + (NSData *)dataWithJSONObject:(id)obj options: (NSJSONWritingOptions)opt error:(NSError **)error;
  • 39.
  • 40.
    UIScreen Controlando o brilho da tela @property (nonatomic) CGFloat brightness; @property (nonatomic) BOOL wantsSoftwareDimming; ( Cuidado com essa propriedade, ela pode causar uma animação mais lenta se estiver habilitada )
  • 41.
    UIScrollview Controlando o pontode parada de um scroll - (void)scrollViewWillEndDragging:(UIScrollView *)sv withVelocity:(CGPoint)vel targetContentOffset:(inout CGPoint *)tCO; ( a variável tCO contem o possível ponto de parada da scrollView, e você pode altera-lo para o ponto que achar melhor. Cuidado para não estraga a "física" da scrollView, ou o usuário pode ficar perdido)
  • 42.
    UIReferenceLibraryViewController Exibindo definições depalavras - (id)initWithTerm:(NSString *)term; + (BOOL)dictionaryHasDefinitionForTerm:(NSString *)term;
  • 43.
    UITableView Registrando UITableViewCell comum identifier - (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)ident; Como recuperar um Nib UINib *nibFile = [UINib nibWithNibName:@"MyNib" bundle:nil]; ( Importante definir na UITableViewCell o mesmo identifier )
  • 44.
    UIImage Imagens animadas + (UIImage*)animatedImageNamed:(NSString*)name duration: (NSTimeInterval)duration; Busca por name0, name1.... + (UIImage*)animatedImageWithImages:(NSArray *)images duration:(NSTimeInterval)duration; @property (nonatomic, readonly) NSArray *images; @property (nonatomic, readonly) NSTimeInterval duration;
  • 45.
    UIImage Imagens redimencionadas (tiles) -(UIImage*)resizableImageWithCapInsets:(UIEdgeInsets)i; duration:(NSTimeInterval)duration; {0, 1, 0, 1}
  • 46.
  • 47.
    UIViewControllerContainer Container - (void)addChildViewController:(UIViewController *)cvc; -(void)removeFromParentViewController; @property (readonly) BOOL childViewControllers; Após executar o método <addChildViewController:> deve-se este método no controllers adicionado: - (void)didMoveToParentViewController:(UIViewController *)cvc;
  • 48.
    UIViewControllerContainer Transição entre controllers -(void)transitionFromViewController:(UIViewController *)fvc toViewController:(UIViewController *)tvc duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
  • 49.
    UIStepper Controle para aumentarou diminuir um valor @property (nonatomic) BOOL autorepeat; @property (nonatomic) double maximumValue; @property (nonatomic) double minimumValue; @property (nonatomic) double stepValue; @property (nonatomic) double value;
  • 50.
    Twitter & Accounts "Single sign-on"
  • 51.
    Twitter & Accounts "Single sign-on" TWRequest; Responsável por efetuar requisições para a API do Twitter. Caso seja um recurso protegido, basta definir a propriedade <account>. Saiba os métodos disponíveis em: http://dev.twitter.com/docs/api TWTweetComposeViewController ViewController que permite ao usuário enviar um tweet. Pode ser adicionado uma imagem, ou url ao tweet antes de exibi-lo.
  • 52.
    Twitter & Accounts "Single sign-on" Código para recuperar todas as contas disponíveis
  • 53.
  • 54.
    UIStoryBoards Fácil de criare visualizar a navegação do aplicativo
  • 55.
    UIStoryBoard UIViewController @property (readonly, retain)UIStoryBoard *storyboard; - (void)performSegueWithIdentifier:(NSString *)id sender: (id)sender; - (void)prepareForSegue:(UIStoryboardSegue *)segue sender: (id)sender; - (void)instantiateViewControllerWithIdentifier:(NSString *)identifier
  • 56.
    UIStoryBoard UITableViewController Protótipo de células de tabelas dentro da própria tabela
  • 57.
    UIStoryBoard UITableViewController Tabelas com conteúdo estático pre definido
  • 60.
    Sincronização remota emtempo real entre aplicativos
  • 61.
    Configurando iCloud emseu aplicativo • Habilitar o provisioning profile com permissão para iCloud • Atualizar provisioning profile no Xcode • Marcar o campo <entitlements> dentro do summary do aplicativo
  • 62.
  • 63.
  • 64.
  • 65.
    Newsstand Revistas e jornaisno seu iDevice • Possibilita download de conteúdo em background • Possibilita que o aplicativo seja lançado em background via push notification • Possibilita downloads de itens separados do servidor em background. • Ícone do aplicativo pode ser alterado para refletir a última edição recebida.
  • 66.
    Animações e ediçãobásica de imagens Utilizando QuartzCore, CoreAnimation e CoreImage
  • 67.
    CALayer Toda UIView temuma CALayer responsável por desenhar o conteúdo na tela. Seus atributos podem ser animados Para acessar a layer de uma UIView: UIView *view = [[UIView alloc] init]; CALayer *layer = view.layer;
  • 68.
    CALayer • cornerRadius Deixa a view com borda arredondada. Caso a view possua conteúdos perto da borda, pode ser necessário utilizar a propriedade <clipToBounds> da view para que o conteúdo seja escondido UIView *view = [[UIView alloc] init]; CALayer *layer = view.layer; layer.cornerRadius = 8;
  • 69.
    CALayer • borderColor, borderWidth Define cor e tamanho da borda da view. Acompanha o traçado do cornerRadius, se houver. A cor é definida com uma referencia do tipo CGColorRef. UIView *view = [[UIView alloc] init]; CALayer *layer = view.layer; layer.borderWidth = 3; layer.borderColor = [UIColor redColor].CGColor;
  • 70.
    CALayer • shadowOpacity, shadowRadius, shadowOffset, shadowColor Define opacidade, radius, offset e cor da sombra da UIView. O offset é definido como um CGSize e determina a partir do centro da view para qual direção a sombra vai se deslocar. UIView *view = [[UIView alloc] init]; CALayer *layer = view.layer; layer.shadowOpacity = 0.8; layer.shadowColor = [UIColor redColor].CGColor; layer.shadowRadius = 2; layer.shadowOffset = CGSizeMake(0,1);
  • 71.
  • 72.
    Design e imagens Regrados 44x44 pixels A área mínima de um controle que aceite um toque deve ser de 44x44 pixels.
  • 73.
    Design e imagens Regrados 44x44 pixels
  • 74.
    Design e imagens Regrados 44x44 pixels UINavigationBar tem 44px de altura, e apesar de seus botões interior terem 30px de altura, sua área de toque é estendida para os 44px
  • 75.
    Design e imagens Tamanhodos ícones do aplicativo • AppStore: 512x512px • iPad: 72x72px • Home screen: 57x57px • Home screen (Retina display): 114x114px
  • 76.
    Design e imagens Tamanhoda tela e desenvolvendo para tela Retina • iPhone: 320x480 • iPad: 768x1024 • IPhone Retina: 640x960 Importante notar que para desenvolver para tela retina basta multiplicar por 2 o tamanho do objeto numa tela não retina. Ex: uma imagem 50x50 em tela normal, em tela retina seria 100x100. E para utilizar imagens em retina, basta ela ter o mesmo nome da normal acrescentada de @2x antes da extensão.
  • 77.
    Design e imagens Tamanhodos elementos internos • Status bar: 20px de altura • Navigation bar: 44px de altura • Tab bar: 49px de altura • Bar itens: 30x30 pixels
  • 78.
    Rasteando o usuário dentrodo aplicativo Aprendendo com o usuário o que mais importante e o que funciona melhor
  • 79.
    Rasteando o usuáriodentro do aplicativo As melhores ferramentas disponíveis no momento são Google analytics e Flurry. Ambas são muito parecidas em termos de funcionalidades mas cada uma se destaca em uma área.
  • 80.
    Flurry • Analytics paraiOS, Android, Blackberry, Windows Phone, JavaME, HTML5. • Rastreia dados como sexo do usuário, idade e ID (desde que esses dados sejam fornecidos pelo programador) • Relatórios são mais simples porém. Google analytics • Analytics para iOS, Android e HTML. • Rastreia dados customizados definidos pelo desenvolvidor • Integração com ecommerce, e campanhas. Versão web • Relatórios detalhados, mesmo painel da versão web.
  • 81.