L'iPhone d'Apple fournit un nombre limité de polices pour les développeurs. La liste des polices disponibles est facilement réalisé par le code, comme nous le verrons. Si vous souhaitez utiliser vos propres polices de caractères, par exemple en l'incluant dans les ressources, il est un peu plus articulé et conivolge également la délivrance des licences (droits) sur les polices "embeddati" ... nous en reparlerons plus tard. De retour au lieu de présenter l'iPhone police officielle nell'Apple ceux-ci sont (cliquez sur l'image pour agrandir):
Le Apple iPhone SDK permet d'accéder à des polices système spéciaux. Ceux-ci sont identifiés par des constantes spécifiques et qui sont:
1 2 3
| [ UIFont boldSystemFontOfSize : 12.0 ] ; UIFont myBoldFont * = [UIFont boldSystemFontOfSize: 12.0]; [ UIFont SystemFontOfSize : 12.0 ] ; UIFont mySystemFont * = [UIFont SystemFontOfSize: 12.0]; [ UIFont italicSystemFontOfSize : 12.0 ] ; UIFont myItalicFont * = [UIFont italicSystemFontOfSize: 12.0]; |
Si vous obtenez réellement un pointeur vers une Odei police le montre l'image ci-dessus il suffit d'utiliser:
1
| [ UIFont fontWithName : @ "Helvetica-Bold" size : 22.0 ] ; UIFont myCustomFont * = [fontWithName UIFont: @ "Helvetica-Bold" taille: 22.0]; |
Comme il est indiqué la direction de la police est spécial, en plus de la famille (Helvetica, Courier, etc ...) doit préciser le type (gras, italique, etc ...). Dans la pratique, par conséquent, une police doit être fournie avec ces caractéristiques. Le Helvetica, par exemple, est présent avec:
1 2 3 4
| Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique |
Si vous voulez afficher vos polices directement sur l'iPhone, voici quelques ligne de code utiles:
1 2 3 4 5 6 7 8 9 10 11 12
| listOfFonts = [ [ NSArray alloc ] initWithArray : [ UIFont familyNames ] ] ; NSArray * listOfFonts = [[ NSArray alloc] initWithArray: [UIFont familynames]]; subFontTypes; NSArray * subFontTypes; int i = 0 ; i< [ listOfFonts count ] ; i ++ ) { for (int i = 0; i <[listOfFonts count]; i + +) { "Font Family: %@" , [ listOfFonts objectAtIndex : i ] ) ; NSLog (@ "famille de polices:% @", [objectAtIndex listOfFonts: i]); NSArray alloc ] initWithArray : [ UIFont fontNamesForFamilyName : [ listOfFonts objectAtIndex : i ] ] ] ; subFontTypes = [[ NSArray alloc] initWithArray: [UIFont fontNamesForFamilyName: [objectAtIndex listOfFonts: i]]]; int j = 0 ; j< [ subFontTypes count ] ; j ++ ) { for (int j = 0, j <[subFontTypes nombre] j + +) { "+----->Type: %@" , [ subFontTypes objectAtIndex : j ] ) ; NSLog (@ "+ -----> Type:% @", [objectAtIndex subFontTypes: j]); } ; [Communiqué de SubFontTypes]; } ; [ListOfFonts release]; |
Avec le SDK 2.2.1 sur mon prêt hypothécaire, j'ai obtenu:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
| Famille de polices: Courrier + -----> Type: Courrier + -----> Type: Courrier-BoldOblique + -----> Type: Courrier-Oblique + -----> Type: Courier-Bold Famille de polices: AppleGothic + -----> Type: AppleGothic Famille de polices: Arial + -----> Type: ArialMT + -----> Type: Arial-BoldMT + -----> Type: Arial-BoldItalicMT + -----> Type: Arial-ItalicMT Famille de polices: STHeiti TC + -----> Type: Light-STHeitiTC + -----> Type: Moyen-STHeitiTC Famille de polices: Hiragino Kaku Gothic Pron + -----> Type: HiraKakuProN-W6 + -----> Type: HiraKakuProN-W3 Famille de polices: Courier New + -----> Type: CourierNewPS-BoldMT + -----> Type: CourierNewPS-ItalicMT + -----> Type: CourierNewPS-BoldItalicMT + -----> Type: CourierNewPSMT Famille de polices: Zapfino + -----> Type: Zapfino Famille de polices: Arial Unicode MS + -----> Type: ArialUnicodeMS Famille de polices: STHeiti SC + -----> Type: Moyen-STHeitiSC + -----> Type: Light-STHeitiSC Famille de polices: American Typewriter + -----> Type: AmericanTypewriter + -----> Type: AmericanTypewriter-Gras Famille de polices: Helvetica + -----> Type: Helvetica-Oblique + -----> Type: Helvetica-BoldOblique + -----> Type: Helvetica + -----> Type: Helvetica-Bold Famille de polices: Marker Felt + -----> Type: Thin-MarkerFelt Famille de polices: Helvetica Neue + -----> Type: HelveticaNeue + -----> Type: HelveticaNeue-Gras Famille de polices: DB LCD Temp + -----> Type: DBLCDTempBlack Famille de polices: Verdana + -----> Type: Verdana-Gras + -----> Type: Verdana-BoldItalic + -----> Type: Verdana + -----> Type: Verdana-italique Famille de polices: Times New Roman + -----> Type: TimesNewRomanPSMT + -----> Type: TimesNewRomanPS-BoldMT + -----> Type: TimesNewRomanPS-BoldItalicMT + -----> Type: TimesNewRomanPS-ItalicMT Famille de polices: la Géorgie + -----> Type: Georgia-Gras + -----> Type: Géorgie + -----> Type: Georgia-BoldItalic + -----> Type: Georgia-Italique Famille de polices: STHeiti J + -----> Type: Moyen-STHeitiJ + -----> Type: Light-STHeitiJ Famille de polices: Arial Rounded MT Bold + -----> Type: ArialRoundedMTBold Famille de polices: Trebuchet MS + -----> Type: TrebuchetMS-italique + -----> Type: TrebuchetMS + -----> Type: Trebuchet-BoldItalic + -----> Type: TrebuchetMS-Gras Famille de polices: STHeiti K + -----> Type: Moyen-STHeitiK + -----> Type: Light-STHeitiK |
En savoir plus ...
<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> une fonction utile durant les premiers stades d'un projet pour tester et déboguer une application pour iPhone d'Apple ou, plus généralement, dans un environnement XCode. Etre juste une fonction, tout comme l'autre, sa présence se fera sentir, même lors de la libération (release) de notre exécutable. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Il devient donc nécessaire de retirer, d'une certaine façon, toutes les lignes de NSLog() à partir de notre code, car il n'est pas nécessaire, soit parce que les appels à NSLog() pourrait affecter la performance de notre application, surtout si nous mettons NSLog() pour «boucle interne.
Immédiatement écarter la solution à la «look» et «Annuler», parce qu'un jour il pourrait être utilisé à nouveau. Nous excluons aussi la solution du «look» et «commentaires», inconfortables pour la même raison que précédemment. Heureusement, un propre, simple et sont conditionnels à l'aide des compilateurs correctes. Ce que nous faisons dans la pratique, et dire au compilateur d'exclure - s'il ya une condition spécifique - lors de la compilation de nos lignes de source qui contiennent NSLog() .
Les compilations de directives et instructions du compilateur conditionnelle, sont un outil très puissant et très répandue. Ceux qui viennent de l'élaboration de la norme ANSI-C savez certainement très bien et utilizzte dans de nombreuses situations. La particularité de ces «instructions» réside dans le fait, mentionné ci-dessus, pour être vu par le compilateur et non exécutable. Cette caractéristique les rend utiles dans de nombreux cas et peut résoudre les problèmes par ailleurs très ennuyeux.
Voyons un exemple de code qui, comme prévu, vous pouvez "supprimer" en compilant des morceaux de code, dans notre cas NSLog() :
1 2 3 4 5 6
| # Définir une ACTIVE_NSLOG / / Si la constante est définie ACTIVE_NSLOG remplir / / Bloc de code entre # ifdef et # endif # Ifdef ACTIVE_NSLOG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
). Les instructions conditionnelles font partie du compilateur de la même famille que #define , aussi, en fait, sont précédés d'un "livre" ( # ). solo se ACTIVE_NSLOG è definito. Dans l'exemple montré que nous avons défini une constante ACTIVE_NSLOG ; les lignes suivantes de code indique au compilateur de ligne "include" NSLog() que si ACTIVE_NSLOG est défini. Si nous avons pris soin, lors de la rédaction de notre code, insérant des appels à NSLog() dans le bloc #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , il suffit de supprimer la définition de la constante ACTIVE_NSLOG à s'estomper, la prochaine compilation, toute notre NSLog() .
Un meilleure et dernière
Voyons maintenant comment configurer l'environnement XCode pour améliorer encore plus ce que nous avons fait ici! D'abord nous choisissons un nom de constante que nous utilisons dans nos projets visant à exclure de la compilation NSLog() . o quello che preferite. Vous pouvez choisir le nom que vous voulez, à partir de DEBUG à MIO_DEBUG ou ce que vous préférez. Ouvrez votre projet, neuf ou ancien. Placez tous les NSLog() dans le bloc (ou bloc):
1 2 3
| # Ifdef MIO_DEBUG " ... bla bla" ) ; NSLog (@ "... bla bla"); # Endif |
Sélectionnez le fichier principal de votre projet, faites un clic droit et choisissez l'Get Info.

Cela ouvre une fenêtre avec des informations sur le projet:

Sélectionnez l'onglet Générer, vérifier que vous êtes en configuration Debug (ce qui est le joyau), aller à la section utilisateur et d'ajouter, via le bouton en bas à gauche, un nouveau champ appelé OTHER_CFLAGS . A ce assegnamoli la valeur -DMIO_DEBUG=1 . La syntaxe est -D{mia define}=1 .
Cette procédure présente deux avantages:
- Nous ne devons pas mettre dans le code
#define MIO_DEBUG 1 , mais nous le faisons à travers l'information du projet. Donc, quand nous allons à remplir la version (l'un sans l' NSLog() ) nous devons nous rappeler de supprimer la ligne #define MIO_DEBUG 1 - La constante est définie par rapport à la configuration, dans la cas de débogage. Puis, passant à la configuration de sortie (communiqué) sera absent et les lignes constantes avec
NSLog() ne sera pas compilé
Conclusions
La procédure ci-dessus peut être utile dans certains cas moltidutine autres, avec NSLog() , n'ont rien à voir. Les instructions conditionnelles peuvent aider le compilateur dans un large éventail de contextes. Ils sont souvent utilisés par les programmeurs pour déterminer le type de version du système d'exploitation, la cible, la présence de processeurs mathématiques, tout en conservant la même "identique" source.
Pour comprendre cela, à titre d'exemple, nous pouvons utilizzre notre constante MIO_DEBUG aussi d'intervenir dans d'autres domaines du code:
1 2 3 4 5 6 7 8 9 10
| / / Debug s'ils gagnent le match / / Avec un score de 100 au lieu de 10000 :) # Ifdef MIO_DEBUG score == 100 ) if (score de == 100) # Else score == 10000 ) if (score de == 10000) # Endif { ; [HaiVinto auto]; } |
Pour finir, voici quelques exemples et des variantes:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| / / En général, il est un # Si l'expression / / Si la déclaration semblable à la traditionnelle, donc avec une pleine expression
/ / Vérifier si une constante est définie # Ifdef constante
/ / Vérifier si elle n'est pas une constante définie # Ifndef constante
/ / Else # Else
/ / Fermeture du bloc # Endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| / / Par exemple ... # Define DEBUG 1 # Définir MIA_ALTRA_COSTANTE 5
... # Si DEBUG / / Remplissez ce # Else / / Sinon combler cette autre # Endif
# Si MIA_ALTRA_COSTANTE> 4 "..." ) ; NSLog (@ "..."); # Endif |
1 2 3 4
| # Ifndef INCLUDE_MIO_FILE # Définir INCLUDE_MIO_FILE # Include "mio_file.h" # Endif |
En savoir plus ...
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 ...
La syntaxe avec des crochets en Objective-C est l'une des raisons les plus de frustration pour ceux qui viennent d'autres langues (pour les objets). Cependant, s'habituer à elle, vous réalisez à quel lisible le code devient trop avec ce mélange de la syntaxe classique et le plus distinctement Smalltalk. Par exemple, nous voyons comment la même procédure peut être écrite dans la syntaxe. Prenez l'initialisation d'un UIAlertView :
1 2 3 4 5 6 7 8
| [ [ UIAlertView alloc ] initWithTitle : @ "Titolo" UIAlertView MyAlert * = [[UIAlertView alloc] initWithTitle: @ "Titre" "Messaggio" message: @ "Message" délégué: auto "Annulla" cancelButtonTitle: @ "Annuler" "Ok" , nil ] ; otherButtonTitles: @ "Ok", nil]; ; myAlert.tag = 1; ; [MyAlert spectacle]; ; [MyAlert release]; |
Réglage de la potavamo tag quand même:
1 2 3 4 5 6 7 8
| [ [ UIAlertView alloc ] initWithTitle : @ "Titolo" UIAlertView MyAlert * = [[UIAlertView alloc] initWithTitle: @ "Titre" "Messaggio" message: @ "Message" délégué: auto "Annulla" cancelButtonTitle: @ "Annuler" "Ok" , nil ] ; otherButtonTitles: @ "Ok", nil]; 1 ] ; [REGLAGES MyAlert: 1]; ; [MyAlert spectacle]; ; [MyAlert release]; |
Même chose à la lecture lors de l'événement:
1 2 3 4 5
| void ) alertView : ( UIAlertView * ) alertView clickedButtonAtIndex : ( NSInteger ) buttonIndex { - (Void) alertView: (UIAlertView *) clickedButtonAtIndex alertView: (NSInteger) {buttonIndex alertView.tag == 1 ) { // ... if (alertView.tag == 1) {/ / ... / / Ou alertView tag ] == 1 ) { // ... if ([alertView tag] == 1) {/ / ... } |
Remarque: Tous les propriétés ou les méthodes de cette syntaxe double. Dans le cas de « UIAlertView nous avons cette double caractéristique. Pour les autres objets, ou dans d'autres cas, cependant, ne peuvent travailler que l'un des deux ... mais ne me demandez pas pourquoi (selon la façon dont les développeurs ont défini l'interface).
En savoir plus ...
, usata per il debug delle applicazioni. Reprenant le poste à partir d'ActionScript à l'Objective-C (où vous mettez le code et en comparant la syntaxe ActionScript et Objective-C) en Actionscript, nous avons la fonction pratique trace ( ) , utilisée pour les applications de débogage. Cette fonction fournit en sortie un signal de sortie à l'environnement de la console Adobe développement Flash. Il est principalement utilisé au cours du développement et le test de "film" / application. Dans XCode / Objective-C, nous avons: NSLog ( ) . di Actionscript: La syntaxe de cette fonction est très similaire à la trace ( ) en Actionscript:
1
| "Sono una linea di debug" ) ; NSLog (@ "je suis une ligne debug"); |
Dans ActionScript, nous avons:
1
| "Sono una linea di debug" ) ; trace ("Je suis une ligne debug"); |
Outre l'utilisation du signe (@), comme vous pouvez le voir, sont identiques. Les différences et les similitudes () démarre lorsque vous souhaitez afficher les valeurs des variables, par exemple en Actionscript, nous avons:
1 2 3
| "Coordinata x:" + x + " coordinata y:" + y ) ; trace ("coordonnée x:" + x + "coordonnée y" + y); / / Ou "Coordinate: " , x , y ) ; trace ("coordonnées", x, y); |
En Objective-C, nous avons:
1
| "Coordinata x:%i coordinata y:%i" , x, y ) ; NSLog (@ "coordonnée x: y% du% de coordonnées i", x, y); |
che opera sull'Apple System Log. Remarque: NSLog() appelle en fait la fonction plus générique NSLogv ( ) qui fonctionne sur système Apple Connexion. Les fonctions sont en fait identiques, en changeant seulement les paramètres d'entrée.
o sprintf ( ) . Les développeurs C trouverez très familier avec la mise en forme de chaînes, comme avec printf ( ) ou sprintf ( ) . Pour plus de détails, voir de spécificateurs de format de chaîne .
En savoir plus ...
Après avoir installé la version 3.0 du SDK pour l'iPhone d'Apple, manifestement pas encore parfaitement stable, j'ai immédiatement remarqué certains problèmes, à la fois dans la compilation du code est dans le XCode générale. Le plus important - que je signalés rapidement avec une «maison» d'Apple, les développeurs au centre - la création de boutons dans le code. Voici un extrait du code n'est pas compatible avec le SDK 3.0:
1 2 3 4
| [ [ UIButton buttonWithType : UIButtonTypeRoundedRect ] initWithFrame : CGRectMake ( 0 , 0 , 100 , 40 ) ] ; UIButton * myButton = [[UIButton buttonWithType: UIButtonTypeRoundedRect] initWithFrame: CGRectMake (0, 0, 100, 40)]; @ "Bottone" forState : UIControlStateNormal ] ; [MyButton setTitle: @ "Button" forState: UIControlStateNormal]; / / Autres paramètres myButton ] ; [Self.view addSubview: myButton]; |
En remplissant ce code avec le SDK 2.2.1 vous obtenez un bouton classique avec l'étiquette "Bouton". Avec la version 3.0 du SDK, le bouton est créé, mais l'étiquette disparaît. la situazione sembra migliorare, nel senso che la label viene resa apparentemente in modo corretto. Utilisation en tant que buttonWithType le type UIButtonTypeCustom la situation semble s'améliorer, en ce sens que l'étiquette est apparemment fait correctement. Il est encore étrange pour la panne soudaine du type UIButtonTypeRoundedRect . Je suis toujours en attente d'une réponse d'Apple ... Je viens de nouveautés; place!
En savoir plus ...
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 ...
Derniers Commentaires
kOoLiNuS : @ Giovambattista Fazioli: merci! plus que disposés!
Giovambattista Fazioli : @ kOoLiNuS: Calme, vous pouvez probablement prévoyons que WPX Cleanfix sera libre, et ...
kOoLiNuS : @ kOoLiNuS: un manque
et un 
kOoLiNuS : @ Giovambattista Fazioli: Je me suis abonné, mais quand j'étais mon usage amateur de la plate-forme ...
Giovambattista Fazioli : @ kOoLiNuS: Oui, c'est un problème connu. Se produit lorsque les tables en question sont ...