«Interface Builder» Articles taggés

Très court extrait: le UIView pour afficher une image

Travailler avec Interface Builder peut être spontanément utiliser un objet UIImageView pour définir l'arrière-plan de notre contrôleur de vue. Sinon, vous pouvez supprimer cet objet, ce qui économise un peu de mémoire, et d'exploiter la vue associée avec le contrôleur de vue. Il suffit de brancher dans notre contrôleur de vue:

En savoir plus ...

Objective-C: comment faire pivoter une image dans l'espace 3D

), un oggetto di più basso livello con innumerevoli potenzialità. La classe UIView définit un pointeur vers la couche ( CALayer ), l'objet d'un niveau inférieur au potentiel infini. La couche fournit une gamme de méthodes et des propriétés associées à l'affichage du contenu de l'affichage. Par exemple, vous pouvez manipuler le contenu d'un point de vue dans un espace tridimensionnel. Dans ' de telle sorte que le report est intéressant de noter que le code est simple, et tout est créé en utilisant Interface Builder:

En savoir plus ...

Comment trouver des images et des vues dans Interface Builder

Après avoir expliqué comment localiser nos chaînes dans Xcode , comme nous le voyons aujourd'hui est simple - appliquant la même technique - de localiser et de visualiser des images et des interfaces créés avec Interface Builder.

Localiser les ressources graphiques

Le processus, tel que mentionné, est le même, si nous avons une image déjà inclus dans nos ressources, ou qu'ils en insérer un nouveau, et nous voulons de «localiser» - qui consiste à gérer deux ou plusieurs images sur la base des langues prises en charge - il suffit de cliquer sur le bouton Image de droite ( Adium.png dans cet exemple) et sélectionnez Get Info:

Nous cliquez sur Créer un fichier localisable dans le coin inférieur gauche.

Cliquez sur Ajouter et insérer la localisation Italian :

Afin d'obtenir:

esattamente come accadeva con il testo: Notre image est déplacée (physiquement, l'une des rares fois où que se passe nell'alberatura Xcode est réfléchi sur le système de fichiers) dans des dossiers virtuels English.lproj et Italian.lproj exactement comme cela s'est produit avec le texte:

contiene una stessa versione dell'immagine. À ce stade, chacun des dossiers English.lproj et Italian.lproj contient la même version de l'image. Cette image est manipulée dans Interface Builder, où nous verrons - par défaut - la version anglaise.
À ce stade, il suffit de remplacer un (ou les deux fichiers Adium.png ) pour obtenir une localisation des images "flash".

Localisez le fichier XIB

Même les interfaces construites avec Interface Builder peut être localisé dans leur intégralité, lorsque cela est jugé nécessaire. ) con interfaccia XIB , lo selezioniamo, scegliamo Get Info dal menu contestuale, rendiamo il file localizzabile, aggiungiamo la localizzazione in italiano: La procédure est identique à celle réalisée avec les capacités graphiques: ajouter un ViewController (par exemple infoViewController ) d'interface XIB, nous la sélectionnons, choisissez Obtenir des informations dans le menu contextuel, donner le localisable fichier, ajoutez la localisation en italien:

ViewController

Cliquez sur l'anglais ou l'italien ouvrira Interface Builder! ) all'interno della classica cartella Classes . Cette fois, le système de fichiers, nous remarquerons que vous avez créé deux répertoires ( English.lproj et Italian.lproj ) dans le dossier classique des classes. Les deux auront leur fichiers infoViewController.xib . Le confort dans ce domaine, clairement résolue dans le code, quand on va à instancier notre code du contrôleur, nous aurons un «propre» comme ceci:

1
2
[ InfoViewController alloc ] ; InfoViewController * info = [InfoViewController alloc];
info.view ] ; [Self.view addSubview: info.view];

Comme vous pouvez le voir il n'y a pas trace d'une déclaration concernant l'emplacement, entièrement géré par le système. Les deux interfaces, bien sûr, peut être complètement différent en ce sens qu'ils sont à tous égards que deux fichiers séparés XIB.

En savoir plus ...

iPhone SecondApp: Devinez le nombre - Partie 2

Comme mentionné iPhone FirstApp: Devinez le nombre - Partie 1 , nous verrons comment faire une demande de l'iPhone d'Apple sans utiliser Interface Builder! En effet, nous allons éliminer les fichiers physiques créés par Interface Builder Xcode assistant. A la fin de ce post, alors, nous avons une demande identique à tous égards, à celles construites dans la première partie, avec la différence que nous allons atteindre tous nos composants visuels, y compris la fenêtre principale, pour le code complet.

L'application déjà fait, si vous voulez juste de télécharger, est disponible sur mon dépôt de Google Code:

Je tiens à souligner d'emblée comme le ZIP de cet exemple pèse moins que la dernière fois! :)

Nous créons le projet

Nous commençons par créer notre projet SecondApp (pour le distinguer de FirstApp), mais cette fois choisissez Fenêtre application basée sur:

newproject

Maintenant, nous allons supprimer tout ce qui touche à Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Éliminer le fichier MainWindow.xib , situé dans le dossier Resources , le retirer du système de fichiers aussi, et puis sélectionnez Déplacer vers la Corbeille également. nella casella Main nib file base name : Sélectionnez ensuite le fichier SecondoApp-info.plist et supprimer la référence à la MainWindow fichier nib dans le nom de la boîte principale base:

deleteib

À ce stade, nous n'avons plus aucune fenêtre, au moins par Interface Builder. , e modifichiamo la funzione main() in questo modo: Donc, nous ouvrons le fichier main.m , situé dans Other Sources , et de modifier la fonction main() comme ceci:

1
2
3
4
5
6
7
8
9
10
11
int argc, char * argv [ ] ) { int main (int argc, char * argv []) {

pool = [ [ NSAutoreleasePool alloc ] init ] ; NSAutoreleasePool * pool = [[ NSAutoreleasePool alloc] init];

/ / En supprimant le fichier. XIB, nous avons perdu le suivi
/ / Le délégué app puis la passer à "la main"
UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int = retVal UIApplicationMain (argc, argv, nul, @ "SecondAppAppDelegate");

; [Communiqué de piscine];
retourner retVal;
}

Ouvrez SecondAppAppDelegate.me puis nous créons la fenêtre principale via le code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ) applicationDidFinishLaunching : ( UIApplication * ) application { - (Void) applicationDidFinishLaunching: (UIApplication *) application {

/ / Retourne la taille de l'écran (320, 480)
UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[mainScreen UIScreen] applicationFrame];
/ / Créer une fenêtre - comme nous l'avons fait bye bye à Interface Builder
[ [ UIWindow alloc ] initWithFrame : windowRect ] ; UIWindow mainWindow * = [[UIWindow alloc] initWithFrame: windowRect];
/ / Définit l'arrière-plan de la fenêtre au jaune, à la différence
/ / Le FirstApp demande antérieure
[ UIColor yellowColor ] ] ; [SetBackgroundColor MainWindow: [UIColor yellowColor]];

mainWindow ] ; [Self setWindow: mainWindow];
; [Fenêtre makeKeyAndVisible];

; [MainWindow release];
}

Vous pouvez déjà tester l'application, si une fenêtre apparaît en jaune vous avez tout fait correctement!

, necessario solo se si usa Interface Builder. Dans le fichier SecondAppAppDelegate.h nous pouvons éliminer IBOutlet , n'est nécessaire que si vous utilisez Interface Builder. En outre ajouter ici que nos variables globales, la dernière fois nous étions entrés dans le contrôleur. Ensuite, modifiez le fichier SecondAppAppDelegate.h :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Import <UIKit/UIKit.h>

NSObject <UIApplicationDelegate> { SecondAppAppDelegate Interface @: NSObject {<UIApplicationDelegate>
UIWindow * fenêtre;

UITextField * nombre;
UIButton * bouton;
int numeroACaso;
}

nonatomic, retain ) UIWindow * window; @ La propriété (nonatomic, conserver) UIWindow * fenêtre;

void ) controllaNumero; - (Void) getNumber;

@ Fin

, in quanto non stiamo usando Interface Builder. Dans ce cas également, nous avons préparé la définition de méthode controllaNumero , comme la dernière fois, mais nous avons éliminé l'indication IBAction , puisque nous ne sommes pas en utilisant Interface Builder.

Nous construisons le code de l'interface

Il est temps de créer un code en utilisant tous les composants de notre interface. ed inseriamo il seguente codice: Nous reviendrons dans le fichier SecondAppAppDelegate.m , posizioniamoci avant [mainWindow release] et insérez le code suivant:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/ / Créer la barre de titre
[ [ UINavigationBar alloc ] initWithFrame : CGRectMake ( 0.0 , 0.0 , 320.0 , 44.0 ) ] ; UINavigationBar myNavigationBar * = [[UINavigationBar alloc] initWithFrame: CGRectMake (0.0, 0.0, 320.0, 44.0)];
myNavigationBar.barStyle = UIBarStyleDefault;
[ [ UINavigationItem alloc ] initWithTitle : @ "Indovina un numero" ] ; UINavigationItem navigationItem * = [[UINavigationItem alloc] initWithTitle: @ "Devinez un certain nombre"];
navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animé: NO];
myNavigationBar ] ; [Fenêtre addSubview: myNavigationBar];

/ / Création de l'étiquette
[ [ UILabel alloc ] initWithFrame : CGRectMake ( 10 , 50 , 300 , 80 ) ] ; UILabel MyLabel * = [[UILabel alloc] initWithFrame: CGRectMake (10, 50, 300, 80)];
UIColor clearColor ] ; myLabel.backgroundColor = [UIColor clearColor];
; myLabel.numberOfLines = 2;
"iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?" ; myLabel.text = @ "iPhone a conçu un certain nombre de 1 à 10, essayer de deviner?"
myLabel ] ; [Fenêtre addSubview: MyLabel];

/ / Créer la saisie de texte
UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; = nombre [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)];
numero.borderStyle = UITextBorderStyleRoundedRect;
numero.textAlignment = UITextAlignmentCenter;
numero.keyboardType = UIKeyboardTypeNumberPad;
"Inserisci il numero" ; numero.placeholder = @ "Entrez le numéro de";
numero ] ; [Fenêtre addSubview: nombre];

/ / Créer le bouton
UIButton buttonWithType : UIButtonTypeRoundedRect ] ; button = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Premi qui" forState : UIControlStateNormal ] ; [Bouton setTitle: @ "Cliquez ici" forState: UIControlStateNormal];
self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; [Bouton AddTarget: action d'auto: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside];
bottone ] ; [Fenêtre addSubview: le bouton];

; [MyLabel release];
; [NavigationItem release];
; [MyNavigationBar release];

della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Depuis la « applicationDidFinishLaunching correspond à viewDidLoad que la dernière fois, juste après le [mainWindow release]; insérer:

1
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random () est 10%;

Maintenant, nous pouvons faire est de mettre en œuvre la méthode controllaNumero , qui sera identique (à l'exception du prototype) à celle utilisée la dernière fois:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ) controllaNumero { - (Void) {getNumber
"Premuto bottone di controlla numero" ) ; NSLog (@ "nombre Pressé de contrôle sur le bouton");
[ numero.text integerValue ] ; numeroInserito int = [numero.text integerValue];
message; NSString * message;
"Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "Le numéro saisi est% d", numeroInserito);
numeroInserito <numeroACaso ) { si (numeroInserito <numeroACaso) {
"Troppo basso..." ; message = @ "trop ​​faible ...";
( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) {
"Troppo alto..." ; message = @ "trop ​​élevé ...";
( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) {
"Bravo hai indovinato" ; message = @ "Bravo vous avez deviné";
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random () est 10%;
"Numero pensato %d" , numeroACaso ) ; NSLog (@ "% Nombre d pensé," numeroACaso);
}
[ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc]
"Responso" initWithTitle: @ "Réponse"
message: message
délégué: néant
"OK" cancelButtonTitle: @ "OK"
] ; otherButtonTitles: nil];
; [AlertMessaggio spectacle];
; [AlertMessaggio release];
"" ; numero.text @ = "";
}

Nous en avons terminé!

Conclusions et considérations

, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Cet exemple ne fait pas l'utilisation directe d'un UIView ou UIViewController , parce que je voulais le laisser aussi simple et rationnel que possible et, aussi, de montrer que les éléments ne sont pas toujours nécessaires. Cependant, l'insertion d'objets directement dans la fenêtre peut avoir un certain sens dans cet exemple et d'autres contextes sporadiques. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. L'utilisation de UIView et UIViewController encore apporter des avantages dans de nombreux autres cas, etdans certains sont presque indispensable, comme nous le verrons dans le futur.

En savoir plus ...

iPhone FirstApp: Devinez le nombre - Partie 1

La première source que je suis allé dans ses mains a été écrit en Basic et se composait de quelques lignes de code, de m'avoir éclairé. C'était un jeu simple qui a généré un nombre aléatoire de 1 à 10 et, à travers l'entrée au clavier, a prouvé que le nombre entré est Maggione, inférieur ou égal au nombre aléatoire. En dépit de sa rude simplicité reste, pour moi, l'un des meilleurs exemples - simple, ludique et pratique - pour expliquer à ceux qui ne savent rien sur la programmation qu'entend-on réellement pour «programme d'ordinateur". J'ai donc décidé de le proposer pour l'iPhone d'Apple, peut-être aidera quelqu'un ...

En savoir plus ...

Salut téléphone

iphone A partir d'aujourd'hui a inauguré une nouvelle section (catégorie à être corrigée) dédié au développement d'applications sur l'iPhone d'Apple! Je déclare maintenant que la plupart des articles qui seront la publication d'un "cut" en ligne avec l'esprit de ce blog, qui sera principalement pour les utilisateurs avancés. Cependant, comme je l'ai fait dans d'autres sujets, essayez d'être aussi clair que possible et, le cas échéant, mettre un peu de "concept de base« utile à un public plus large.

En savoir plus ...


Arrêtez SOPA