Mini Tuto iPhone : Touches, Dessin
Philippe49
Membre
Une toute chtite application iPhone pour les débutants de chez "je connais pas"
(Etape 1) On fait apparaà®tre un rectangle rouge sur l'écran.
(Etape 2) On définit une property pour le rectangle.
(Etape 3) On touche l'écran et on écrit la position du contact.
(Etape 4) On fait glisser son doigt sur l'écran, et le rectangle rouge suit le mouvement.
(Etape 1) On fait apparaà®tre un rectangle rouge sur l'écran.
(Etape 2) On définit une property pour le rectangle.
(Etape 3) On touche l'écran et on écrit la position du contact.
(Etape 4) On fait glisser son doigt sur l'écran, et le rectangle rouge suit le mouvement.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
1) Créer un projet du type View-Based Application, par exemple, on va la nommer Vico.
2) On dispose d'une classe VicoAppDelegate et d'une classe VicoViewController.
3) Build and Go ... cela marche déjà
4) Ajouter une classe VicoView héritant de UIView : clic droit sur le group "Classes", et Add > New File. Choisir le template UIView.
5) Ouvrir le xib VicoViewController.xib par double-clic, sélectionner la vue, ouvrir le panel Identity , et mettre VicoView pour la classe de cette vue.
6) Coder la méthode drawRect dans le fichier VicoView.m
Cette méthode drawRect est appelée chaque fois que la vue doit être redessinée.
7) Build and Go ==> un beau rectangle rouge
Continuer :
Le but est de sortir le CGRect de la méthode de dessin drawRect pour pouvoir accéder à ce CGRect de l'extérieur, d'en faire une variable d'instance pour pouvoir la modifier un peu de n'importe où au sein de ta UIView. Ces étapes sont nécessaires à ce qui va suivre, permettant de modifier la position et la taille du rectangle à dessiner.
Le dessin de ce rectangle, lui, doit rester dans la méthode drawRect:
(explication d'Aligator)
8) On passe le rectangle à dessiner en property de la VicoView
9) La méthode viewDidLoad est appelée après le désarchivage du xib VicoViewController.xib. Cela est l'occasion de finaliser les initialisations en définissant la taille du rectangle initial à dessiner dans la vue.
10) Build and Run
Ne pas oublier de cocher "User Interaction Enabled" sur la vue dans IB.
(Commentaires d'Aligator)
11) Mettre dans VicoViewController.m la méthode suivante :
12) Build and run et ouvrir la console : On doit y voir les coordonnées du point de contact, que l'on peut contrôler par rapport au rectangle rouge présent dans la vue.
13) Définir une variable d'instance touchLocation dans le viewController
14) Repérer le rectangle à dessiner dans touchesBegan et touchesMoved
15) Build and Run .. That's all
Continuer :
Vos questions à venir , vos solutions pour les exemples ...
//
// VicoView.m
// Vico
//
// Created by turpin on 15/04/09.
// Copyright 2009 bejoga. All rights reserved.
//
#import "VicoView.h"
#import "VicoViewController.h"
#import "VicoView.h"
@implementation VicoView
@synthesize rectToDraw;
@implementation VicoViewController
@end
- (void)drawRect:(CGRect)rect {
CGContextRef context=UIGraphicsGetCurrentContext();
// CGRect r;
// r.origin.x=10.; r.origin.y=30.;
// r.size.width=100.; r.size.height=130.;
CGContextSetRGBFillColor(context, 1., 0., 0., 1.);
CGContextFillRect (context,rectToDraw);
}
- (void)dealloc {
[super dealloc];
}
- (void)drawRect:(CGRect)rect {
CGContextRef context=UIGraphicsGetCurrentContext();
CGRect r;
r.origin.x=10.; r.origin.y=30.;
r.size.width=100.; r.size.height=130.;
CGContextSetRGBFillColor(context, 1., 0., 0., 1.);
CGContextFillRect (context,r);
}
@end
Voici le code de ma VicoView.m
J'ai une erreur qui dit method definition not in @implementation context
et un warning pour @end missing ( alors qu'il y est c'est tout au debut )
Comment faire ?
merci d'avance
Tu dois avoir six fichiers différents VicoAppDelegate.h et .m , VicoViewController.h et .m , VicoView.h et .m
Et le code se répartit entre ces différents fichiers.
Je crois qu'il te faut reprendre dès le départ pour attribuer correctement le code.
Le message t'indique une mauvaise gestion des @implementation et @end.
Dans un fichier .m, on trouve (dans un modèle de base) une et une seule fois @implementation et @end
Dans un fichier .h, on trouve (dans un modèle de base) une et une seule fois @interface et @end
Le cours n°5 enquestion n'est pas encore disponible sur iTunes, mais j'ai déjà récupéré le pdf ici : http://www.stanford.edu/class/cs193p/cgi-bin/index.php
Quoi qu'il en soit ces cours sont très bien pour qui veut découvrir la programmation sur iPhone (et cocoa en général). Certes c'est limité aux personnes à l'aise en anglais, mais le fait d'avoir un ingénieur Apple devant un tableau pour nous faire un cours rend la chose évidemment plus captivante que n'importe quel bouquin.
A bon entendeur...
J'esseyerais de comprendre le tuto de stanford.
Sinon phillipe j'ai melanger les codes car dans ton tuto tu ne dit pas où les mettre. Cela peux te paraitre évident mais pour moi et les autres "très" débutants c'est difficile.
Merci de le signaler, je vais préciser !
[EDIT] Voilà
Une question cependant, comment faire pour disposer de la totalité de l'écran pour dessiner ? Comment désactiver la barre de statut en haut, qui "mange" une partie de l'écran ?
Sélectionner info.plist
Sélectionner une des lignes, appuyer sur le + tout à droite
Ajouter dans la colonne de gauche UIStatusBarHidden
Dans la colonne de droite mettre à YES.
Solution 2
Dans applicationDidFinishLaunching du delegate de l'UIApplication (VicoAppDelegate) mettre
- (void)applicationDidFinishLaunching:(UIApplication *)application {
application.statusBarHidden=YES;
...
}
J'ai voulu initialiser la couleur d'un rectangle. Pour ce faire, j'ai inséré une ligne de code dans la méthode iniWithFrame() de la View. Si j'ai bien compris, cette méthode est appelée lors de l'initialisation de la View. Cela n'a pas fonctionné.
J'ai recréé un projet vierge en suivant la procédure décrite au début du tuto, en insérant un NSLog() dans initWithFrame, pour tester à vif.
Et surprise, le texte "Initialisation" n'apparaà®t pas sur la console, montrant que la séquence d'initialisation ne se fait pas.
Afin de vérifier j'ai inséré un autre NSLog() dans la méthode drawRect(). Et là le texte "Draw.." s'affiche bien sur la console.
Y a-t-il quelque chose que je n'ai pas compris sur l'utilisation de initWithFrame() ?
Non, elle n'est pas appelée. Le fichier xib est une archive (un peu comme un .zip pour expliquer par une image, simple image d'ailleurs car je ne sais pas si il y a une compression en cause), lors du lancement de l'application les UIView sont désarchivées via initWithCoder: et non initialisées via initWithFrame.
Seules les UIView créées par du code vont en général être initialisées par initWithFrame:
-(void) awakeFromNib {
NSLog(@Initialisations Complémentaires);
}
Je vais tenter l'awakeFromNib méthode !
Sauf quej e dessine comme ça :
Je vois pas comment ajouter ça à mon tableau et encore moins comment ré-appeler pour tout dessiner ...
Autrement tu peux encapsuler tes données dans un NSObject.
Merci quand même
C'est le métier qui rentre !
vous trouverez sur mon site plein de tutos DONC un qui ressemble beaucoup. Je décrit pas à pas toutes les étapes.
http://web.me.com/jennifer.aubinais/
Jennifer
Les "explications d'Aligator" mènent à une page vendant l'ancien nom de domaine de pommedev. ???
http://pommedev.mediabox.fr/index.php?topic=3492.new;topicseen#new