Catégorie «Mobile»


iPad: écrans de démarrage poignée

Sur l'iPhone d'Apple et l'iPod ont été utilisés pour gérer un fichier image unique pour charger l'application, le fichier Default.png . Le iPad d'Apple, cependant, la gestion différente dell'orientamente exige l'adoption de plusieurs fichiers image, pour être sûr que vous voyez l'écran de démarrage all'orientamente corrigée pour le périphérique. Au cours de démarrage de l'application, comme il l'a fait pour l'iPhone, il n'est pas possible de prendre le code pour "étonnant" que le dispositif orienté. Heureusement, il a été introduit dans le chargement automatique des fichiers spéciaux sur l'orientation:

Les fichiers sont actuellement pris en charge, en plus de la classique Default.png que vous ne devez jamais utiliser car il est redimensionné et déformé en fonction de l'orientation, sont les suivants:

  • Default-Portrait.png
  • Default-PortraitUpsideDown.png
  • Default-Landscape.png
  • Default-LandscapeLeft.png
  • Default-LandscapeRight.png

e LandscapeRight possono essere utilizzate per determinare orietamento e verso di quest'ultimo. Le versions PortraitUpsideDown , LandscapeLeft et LandscapeRight peut être utilisé pour déterminer orietamento et vers celle-ci.

Pour les départs d'application, puis, tel que recommandé par Apple, il est bon de «redessiner» - si nécessaire - notre point de vue agissant dans le cadre application:didFinishLaunchingWithOptions .

En savoir plus ...

setAnimationDidStopSelector: les différentes utilisations et avancées

Dans la plupart des cas, ou parce que nous sommes habitués ou parce que nous avons vu dans les tutoriaux et, dans certains textes, nous utilisons le setAnimationDidStopSelector de cette manière:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nil context : NULL ] ; [BeginAnimations UIView: contexte nulle: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
self ] ; [UIView setAnimationDelegate: self];
@selector ( removeView ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeView)];

; myView.alpha = 0;

; [CommitAnimations UIView];

/ /

void ) removeView { - (Void) {removeView
; [MyView removeFromSuperview];
}

come delegato e tramite la setAnimationDidStopSelector gli invia un messaggio removeView quando l'animazione è terminata. Dans le code ci-dessus l' setAnimationDelegate mettre self en tant que délégué et par le biais setAnimationDidStopSelector envoie un message removeView lorsque l'animation est terminée. Le code lui-même est correct, cependant, fait usage d'une définition de message ( removeView ) qui pourraient être omis. Maintenant, voici le même code, avec le même effet, sans que le message removeView :

1
2
3
4
5
6
7
8
9
nil context : NULL ] ; [BeginAnimations UIView: contexte nulle: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
myView ] ; [SetAnimationDelegate UIView: myView];
@selector ( removeFromSuperview ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeFromSuperview)];

; myView.alpha = 0;

; [CommitAnimations UIView];

! La chose intéressante à propos de cette approche est que myView pourrait être une sous-classe de UIView ! Il peut donc être une classe personnalisée avec nos propres messages et, en la manière prévue, tranquillement appelé par setAnimationDidStopSelector . En outre, les setAnimationDidStopSelector sélecteurs d'accord avec les paramètres:

1
2
3
4
5
6
7
8
9
nil context : NULL ] ; [BeginAnimations UIView: contexte nulle: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
myView ] ; [SetAnimationDelegate UIView: myView];
@selector ( myMessage : param1 : ) ] ; [UIView setAnimationDidStopSelector: @ selector (myMessage: param1 :)];

; myView.alpha = 0;

; [CommitAnimations UIView];

Cet exemple peut être étendu à tous les cas ici où nous nous sommes fixés un délégué, atro n'est pas un pointeur vers une instance d'un objet quelconque.

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 ...

Très court extrait: obtenir la sortie d'une URL en Objective-C

Peut-être que je devrais écrire "Très très très, courts extraits», cependant, est un excellent et pratique "truc" que je vais vous montrer. L'exécution de "deux" lignes de code ci-dessous, vous pouvez obtenir la sortie de n'importe quelle URL et de le manipuler.

En savoir plus ...

10 extrait utiles pour Apple iPhone

Exécuter une méthode après n secondes

Toute la famille performSelector est vraiment intéressant et peut être utile dans une multitude de cas. Son application la plus simple et la plus courante est la suivante:

1
2
3
4
5
@selector ( myMethod ) withObject : nil afterDelay : 3 ] ; [Self performSelector: @ selector (myMethod) withObject: afterDelay nul: 3];
/ /
void ) myMethod { - (Void) {myMethod
"Hello World!" ) ; NSLog (@ "Bonjour tout le monde!");
}

Cependant, considérer que le "timer" n'est pas exacte. Cette procédure devrait donc être utilisée lorsqu'il n'est pas nécessaire de précision «considérable» du temps.

Récupérer la version de la

1
2
version = [ [ [ NSBundle mainBundle ] infoDictionary ] objectForKey : @ "CFBundleVersion" ] ; NSString * version = [[[ NSBundle mainBundle] infoDictionary] objectForKey: @ "CFBundleVersion"];
"versione = %@" , version ) ; NSLog (@ "Version =% @", version);

Oui, c'est vrai ou vrai?

e TRUE sono in pratica la stessa edentica cosa: Aller à passer au peigne fin l'iPhone d'Apple noyau, vous pouvez comprendre que YES , true et TRUE sont pratiquement la même chose edentica:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/ / Définition de la SEJ
# Définir OUI (BOOL) 1
# Définir NO 0 (BOOL)

/ / Définition d'une véritable
# Définir une véritable
# Définir 0 false

/ / Définition de VRAI
# Si! Défini (TRUE)
# Définir 1 VRAI
# Endif

# Si! Défini (FAUX)
# Définir 0 FAUX
# Endif

Au moins pour le moment ...

Vibration

1
2
3
# Import <AudioToolbox/AudioToolbox.h>
/ /
; AudioServicesPlaySystemSound (kSystemSoundID_Vibrate);

Pointeur CGImageRef à partir d'un UIImage

1
2
3
4
[ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage * cœur = [UIImage imageNamed: @ "LittleHeart.png"];
heart CGImage ] ; CGImageRef image = [coeur CGImage];
/ / L'image peut maintenant être «pixellisés» sur une CGContextRef
CGRect ) { 0 , 0 , 100 , 100 } , image ) ; CGContextDrawImage (c, (CGRect) {0, 0, 100, 100}, image);

Animations

1
2
3
4
5
nil context : NULL ] ; [BeginAnimations UIView: contexte nulle: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
/ / ...
; [CommitAnimations UIView];

NSLog

1
2
3
"NSString object %@ " , myString ) ; NSLog (@ "NSString objet% @", maChaine);
"Float: %f " , myFloat ) ; NSLog (@ "float:% f", myFloat);
"Integer: %i " , myInt ) ; NSLog (@ "Integer:% s", myInt);

Convertisseur de RGB à UIColor

1
# Définir RGBA (r, g, b, a) [UIColor colorWithRed: r/255.0 vert: bleu g/255.0: b/255.0 alpha: a]

Passer des paramètres à une NSTimer

Exploiter le paramètre userInfo vous pouvez envoyer un pointeur vers notre objet à la méthode invoquée par minuterie.

1
2
3
4
5
6
7
8
9
10
11
12
13
scheduledTimerWithTimeInterval : 1 target : self selector : @selector ( timerMethod ) userInfo : objectPointer repeats : YES ] ; [ NSTimer scheduledTimerWithTimeInterval: 1 cible: sélecteur de soi: @ selector (timerMethod) userInfo: répétitions objectPointer: OUI];

/ / ...

void ) timerMethod : ( NSTimer * ) timer { - (Void) timerMethod: ( NSTimer *) {timer
/ / Récupérer le pointeur à mon objet
timer userInfo ] ; objectPointer = [minuterie userInfo];
/ / Ou
myMethod ] ; [[Minuterie userInfo] myMethod];
[ [ timer userInfo ] myProperty ] ; int a = [[minuterie userInfo] myProperty];
/ / Quel est le même
[ objectPointer myProperty ] ; int a = [objectPointer myProperty];
}

Durée

Voici une façon simple de calculer le temps court nécessaires pour vérifier la vitesse d'exécution de code:

1
2
3
4
; CFAbsoluteTime initialTime CFAbsoluteTimeGetCurrent = ();
/ / ... code
; CFAbsoluteTime finalTime CFAbsoluteTimeGetCurrent = ();
"Tempo trascorso %f" , finalTime - initialTime ) ; NSLog (@ "f écoulé% du temps", finalTime - initialTime);

En savoir plus ...

Objective-C: exposer des propriétés dans une classe

Je voudrais montrer et de discuter quelques exemples sur la façon d'ajouter et de manipuler les propriétés en Objective-C de classe. : Un exemple classique, précisément, est la suivante: dans la définition de notre interface de classe, nous définissons deux propriétés nome et cognome :

1
2
3
4
5
6
7
8
9
10
11
/ / MyClass.h
# Import <Foundation/Foundation.h>

NSObject { @ Interface MaClasse: NSObject {
nome; NSString * name;
cognome; NSString * name;
}

retain ) NSString * nome; @ La propriété (conserver) NSString * name;
retain ) NSString * cognome; @ La propriété (conserver) NSString * name;
@ Fin

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: Dans le fichier d'implémentation, nous insérons la déclaration @synthesize afin que Xcode va produire pour nous des méthodes getter et setter , respectivement, utilisé pour lire et définir nos deux propriétés:

1
2
3
4
5
6
7
8
/ / MyClass.m
# Import "MyClass.h"

@ Mise en œuvre MyClass

Résumer le nom @, le nom de famille;

@ Fin

, possiamo scrive: Lorsque vous allez utiliser notre classe MyClass , c'est à ce moment istanziaremo un objet de type MyClass , on peut écrire:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Tout autre classe, comme appDelegate
/ / Dans le fichier. H
# Import <UIKit/UIKit.h>
# Import "MyClass.h"

@ Classe TestViewController;

NSObject <UIApplicationDelegate> { TesAppDelegate Interface @: NSObject {<UIApplicationDelegate>
UIWindow * fenêtre;
* TestViewController viewController;

MyClass * myClass;
}

/ / Dans le fichier. M
MyClass alloc ] ; myClass = [MaClasse alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome);

Ou, ce qui équivaut à:

1
2
3
/ / Toujours dans le fichier. M
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass nom]);

Jusqu'ici tout va bien. Toutefois, il pourrait induire en erreur l'équivalence des "variabli" interne (Ivar) comme des biens immobiliers. Pour comprendre la différence, proposer à nouveau la même chose que faire sans, cette fois, le @synthesize . . Maintenant, donc, nous devrions traiter avec nous pour écrire les méthodes getter et setter . Afin de mieux souligner les différences, les variables internes rinominerò insérant un trait de soulignement devant le nom. Mais nous voyons le code:

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

NSObject { @ Interface MaClasse: NSObject {
_nome; NSString * _Nom;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) nom; / / récupère
NSString * ) cognome; // get - ( NSString *) nom; / / récupère

void ) setNome : ( NSString * ) stringaIngresso; // set - (Void) setNome: ( NSString *) stringaIngresso; / / set
void ) setCognome : ( NSString * ) stringaIngresso; // set - (Void) setCognome: ( NSString *) stringaIngresso; / / set

@ Fin

. Contrairement à l'exemple précédent, les pointeurs vers les variables internes (incapsultate) sont devenus _nome et _cognome . . @property è scomparso, in quanto non serve più. En outre, il existe quatre définitions de méthodes qui représentent notre get et set . @property a disparu, ne sont plus nécessaires.
Nous voyons le fichier d'implémentation MyClass.m :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Import "MyClass.h"

@ Mise en œuvre MyClass

/ / Obtenir un "nom"
NSString * ) nome { - ( NSString *) nom {
_Nom Retour;
}
/ / Set pour "nom"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Nom = StringaIngresso;
}

/ / Obtenir de "nom"
NSString * ) cognome { - ( NSString *) nom {
_cognome revenir;
}
/ / Set pour "Last Name"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ Fin

Une classe de sorte écrite peut être utilisé exactement comme le précédent, à savoir:

1
2
3
4
5
6
7
8
MyClass alloc ] ; myClass = [MaClasse alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "% @ = miaClasse.nome" miaClasse.nome);

/ / Ou, ce qui équivaut à:

@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass nom]);

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Au niveau de la négligence éducative @synthesize nous a forcés à écrire "leurs propres" méthodes get et set , en soulignant - même avec l'ajout dell'underscore - les différences entre le nom de la propriété et son Ivar interne _nome .
permette un reale controllo del dato prima della sua impostazione (o prima della sua lettura) e quindi un reale incapsulamento per proteggere la variabile interna. À un niveau fonctionnel à l'usage personnel des méthodes get et set permet un contrôle réel des données avant sa mise (ou avant sa lecture), puis une encapsulation réelle afin de protéger la variable interne.
Par exemple, il serait possible d'empêcher le passage des chaînes vides à la propriété nome :

1
2
3
4
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name";
_Nom = StringaIngresso;
}

Autre variante

Si vous souhaitez utiliser les variables internes avec le trait de soulignement en face (qui rpoviene Adobe ActionScript pourrait être utilisé aussi bien) n'est pas nécessaire d'abandonner l'utilisation de la directive @synthesize . Xcode permet de "fusionner" les méthodes ci-dessus:

1
2
_nome; @ Name = Synthétiser _Nom;
_cognome; @ Name = Synthétiser _cognome;

. Ce faisant, nous pourrions utiliser en interne pointeur _nome ", résume" - à l'extérieur - comme une propriété nome . e setter , è vero anche che lo fa solo se non li trova, quindi se desiderate “implementare” un vostro metodo di getter e/o setter potete farlo anche se avete usato la direttiva @synthesize . En outre, bien que l'utilisation de @synthesize produit méthodes de génération automatique (messages) de getter et setter , est également vrai que ce n'est que si elle les trouve, donc si vous voulez "mettre en œuvre" une méthode pour votre getter et / ou setter peut le faire même si vous avez utilisé la directive @synthesize .

Les allocations de mémoire

Dans les exemples qui précèdent, j'ai omis certains détails importants pour une mise en œuvre réelle. Tout d'abord, je n'ai pas montré toute méthode init() , utile pour l'initialisation d'objet et les valeurs par défaut. De plus, il manque l'addition d'un procédé dealloc() :

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
/ / Fichier MyClass.m
# Import "MyClass.h"

@ Mise en œuvre MyClass

id ) init { - (Id) {init
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Nom @ = "Nom du paramètre prédéfini";
"Cognome preimpostato" ; _cognome @ = "Nom du paramètre prédéfini";
}
retourner soi-même;
}

void ) dealloc { - (Void) dealloc {
; [_Nom De presse];
; [_cognome De presse];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) nom {
_Nom Retour;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso @ = "no name";
_Nom = StringaIngresso;
}

NSString * ) cognome { - ( NSString *) nom {
_cognome revenir;
}
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ Fin

, etc… Dans l'avenir, nous verrons ensuite les détails sur les propriétés readonly , retain , etc ... :)

En savoir plus ...

Navigateur ou navigateur mobile?

Notre site Web n'est plus considérée seulement à partir de terminaux informatiques. Avec la propagation de la téléphonie mobile, grâce à l'iPhone d'Apple, l'accès au site ou blog est de plus en plus effectuée par une variété de dispositifs mobiles. Devenir un développeur Web pour beaucoup ont besoin d'être en mesure d'intercepter et d'identifier les différents "agents", c'est à dire les moyens par lesquels un utilisateur consulte (navigation) nos pages.

En savoir plus ...

Apple iPhone: Créer un bouton personnalisé à bascule

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Les Etats UIControlStateSelected ou UIControlStateHighlighted ne fonctionne pas quand un UIButton mode est réglé UIButtonTypeCustom ! Ou plutôt, ne fonctionnent pas (parce que réservés pour d'autres types de bouton), par exemple pour créer un bouton à deux états: la note bascule. Si nous avons créé deux images (stato1.png et stato2.png) pour notre bouton, nous pouvons procéder comme suit:

1
2
3
/ / Le fichier en-tête que nous créons une variable globale pour usaremo
/ / Bascule le chèque était
ToggleFlag BOOL;

Maintenant nous allons créer notre bouton:

1
2
3
4
5
6
7
8
9
/ / Nous créons un bouton et nous le plaçons d'abord dans l'état "stato1.png"
/ / Modifier initWithFrame: (CGRect)} {100,100,50,50 avec la position et
/ / Taille de l'image a
; toggleFlag = OUI;
[ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}];
@ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" forState: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget ToggleButton: action d'auto: @ selector (onToggle :) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

Lorsque vous cliquez sur le bouton envoyer un message à être gérés onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender {
/ / Récupération de pointeur vers UIButton
( UIButton * ) sender; UIButton ButtonClicked * = (UIButton *) l'expéditeur;
/ / Exécution de la bascule,
toggleFlag = toggleFlag!;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] forState:? UIControlStateNormal];
}

En savoir plus ...

Très court extrait: le streaming des fichiers mp3 à l'iPhone d'Apple

Une alternative très facile à exécuter un flux d'un fichier mp3 sur l'iPhone d'Apple pourrait être:

En savoir plus ...

Objective-C: NSLog () du C struct

o CGPoint , ad esempio. La syntaxe NSLog(@"%@", ... ); qui fonctionne et est utilisé pour obtenir des informations sur les objets, mais ne fonctionne pas sur les types de données tels que C struct CGRect ou CGPoint , par exemple. o NSStringFromCGPoint : Pour profiter de NSLog(@"%@", ... ); également de style C structs nous pouvons nous appuyer sur les fonctions de conversion telles que NSStringFromCGRect() ou NSStringFromCGPoint :

1
2
3
4
5
CGRect ) { 10 , 20 , 30 , 40 } ; CGRect mioRect = (CGRect) {10, 20, 30, 40};
CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64};
/ /
"Info rettangolo: %@" , NSStringFromCGRect ( mioRect ) ) ; NSLog (@ "rectangle Info:% @", NSStringFromCGRect (mioRect));
"Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "point info:% @", NSStringFromCGPoint (mioPoint));

Plus précisément, il est possible d'affiner les procédures correspondantes de petites macros utiles comme:

1
# Définir NSLogRect (rect) NSLog (@ "% s (% 0.0f, 0.0f%) 0.0f%% 0.0fx", # rect, rect.origin.x, rect.origin.y, rect.size.width , rect.size.height)

Ou:

1
2
3
4
# Définir NSLogCGPoint (point) NSLog (@ "% s (% 0.0f, 0.0f%)", # Point.X point, Point.y)

CGPoint ) { 32 , 64 } ; CGPoint mioPoint = (CGPoint) {32, 64};
; NSLogCGPoint (mioPoint);

Cela vous donnera en sortie:

1
32 , 64 ) mioPoint: (32, 64)

En savoir plus ...



Arrêtez SOPA