
Artikel Tagged 'Apple'
Wie stellt man XCode auf das iPhone anstelle des Simulators
iPhone: Erstellen Sie einen Weg, um auf Ereignisse, die Klasse Kreuz reagieren
Normalerweise wird ein Ereignis, das nichts anderes als eine Botschaft befestigt ist (Satz und umgesetzt) in der gleichen Klasse oder den Kontext, die Funktion oder Prozedur "Anrufer" ist. o in un UIViewController . Wenn wir zum Beispiel eine Schaltfläche hinzufügen UIButton via Code (programmatisch), können wir unsere Klasse in einem zu finden UIView oder eine UIViewController . In beiden Fällen ist die Aufgabenverteilung und die Initialisierung der Taste wird durch die Einstellung verfolgt werden target , die eine Nachricht erhalten soll, wenn es "Klick" auf die Schaltfläche ein:
1 2 3 4 5 6 7 8 9 | [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton * button = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30); @ "Press me" forState : UIControlStateNormal ] ; [Button setTitle: @ "Drück mich" Forst: UIControlStateNormal]; / / Entscheiden Sie, wer die Nachricht erhalten UIControlEventTouchUpInside self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget Button: self Aktion: @ selector (OnButtonClicked) forControlEvents: UIControlEventTouchUpInside]; / / ... void ) onButtonClicked { - (Void) {OnButtonClicked / / ... } |
Linie 5 entscheidet, wer den Code oben gezeigt (das Objekt) und was (Methode) "Anruf", wenn unsere gedrückt wird. Im obigen Beispiel ist auch bekannt, dass der Druck Einstellung der Nachricht an die Methode gesendet onButtonClick unten implementiert dann Teil des gleichen Kontext (oder Klasse). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. Die erste Überlegung ist offensichtlich, dass wir tun können, dann, dass durch die Veränderung der Parameter self und action können wir unsere Botschaft an jedes andere Objekt zu senden, dann im Rahmen difuori im Einsatz statt. : Hier ein Beispiel: Eine Klasse UIApplicationDelegate Erstellen eines UIViewController :
1 2 3 4 5 | / / / / MyAppDelegate.m / / SplashScreenController alloc ] ; splashScreenController = [SplashScreenController alloc]; splashScreenController.view ] ; [Window addSubview: splashScreenController.view]; |
associata al UIViewController stesso: Die SplashScreenController stellt eine Methode, die Sie auf den Leib ermöglicht UIView mit zugehörigen UIViewController gleiche:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | / / / / SplashScreenController.m / / void ) animateBackgroundDown { - (Void) {animateBackgroundDown nil context : nil ] ; [UIView beginAnimations: nil context: nil]; 0.75 ] ; [UIView setAnimationDuration: 0,75]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; self ] ; [UIView setAnimationDelegate: self]; @selector ( onAnimationFinished ) ] ; [UIView setAnimationDidStopSelector: @ selector (onAnimationFinished)]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [UIView commitAnimations]; } / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "Animation ist fertig"); } |
. Der obige Code zeigt eine Methode innerhalb der Klasse definiert SplashScreenController Typ UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . Es tut nichts, aber animieren die UIView animieren it down, und wenn die Animation beendet ist, rufen Sie (Senden einer Nachricht an sich selbst - und damit self ) onAnimationFinished unten definiert, ist ein Teil der Klasse immer SplashScreenController . , non saremo informati della fine dell'animazione: Daraus folgt, dass in unserer myAppDelegate , wenn wir die Methode aufrufen animateBackgroundDown , wir werden nicht das Ende der Animation zu informieren:
1 2 3 4 | / / / / MyAppDelegate.m / / ; [SplashScreenController animateBackgroundDown]; |
Was wir wünschen konnte, stattdessen wird auf eine neue Version des erstellen animateBackgroundDown , die mir sagen, wohin die Nachricht am Ende der Animation zu senden, und die Methode zu nennen. In der Praxis wollen wir sicherstellen, dass in unserer Klasse schreiben myAppDelegate :
1 2 3 4 5 6 7 8 | / / / / MyAppDelegate.m / / self selector : @selector ( onAnimationFinished ) ] ; [SplashScreenController animateBackgroundDown: self selector: @ selector (onAnimationFinished)]; / / ... void ) onAnimationFinished { - (Void) {onAnimationFinished "Animazione terminata" ) ; NSLog (@ "Animation ist fertig"); } |
, bensì in myAppDelegate . Dieses Mal die Methode onAnimationFinished ist nicht in der UIViewController , aber in myAppDelegate . nel modo seguente: Dazu ändern Sie einfach die Methode animateBackgroundDown in UIViewController wie folgt:
1 2 3 4 5 6 7 8 9 10 11 12 | / / / / SplashScreenController.m / / void ) animateBackgroundDown : ( id ) target selector : ( SEL ) selector { - (Void) animateBackgroundDown: (id) target-Selektor: (SEL)-Selektor { nil context : nil ] ; [UIView beginAnimations: nil context: nil]; 0.75 ] ; [UIView setAnimationDuration: 0,75]; UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut]; target ] ; [UIView setAnimationDelegate: target]; selector ] ; [UIView setAnimationDidStopSelector: selector]; CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480}; ; [UIView commitAnimations]; } |
). Jetzt haben wir eine Methode, die den "Kontext" (dauert target ) und die Methode call ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Nun, wenn die Animation beendet, erscheint die Meldung AnimationDidStop gesendet werden myAppDelegate jede andere "Objekt" / Klasse, die sie empfangen können.
Objective-C: eine Alternative zur Verwendung CGRectMake
CGRectMake() ist eine Funktion (eigentlich ein Inline # define) verwendet eine Menge vor allem, wenn Sie Grafik-Objekte aus dem Code oder Benutzeroberfläche zu erstellen. o UIImageView . CGRectMake() restituisce una struct (struttura di tipo) CGRect : Seine Verwendung ist daher oft die Initialisierung Komponenten verbunden UIKit , sondern auch auf einfache UIView oder UIImageView . CGRectMake() gibt ein struct (Struktur-Typ) CGRect :
1 2 3 4 5 | struct {CGRect CGPoint Ursprungs; CGSize Größe; }; typedef struct CGRect CGRect; |
: Die wiederum aus zwei verschiedenen struct zusammen CGPoint und CGSize :
1 2 3 4 5 6 7 8 9 10 11 12 13 | struct {CGPoint CGFloat x; CGFloat y; }; typedef struct CGPoint CGPoint; / * Größen. * / struct {CGSize CGFloat Breite; CGFloat Höhe; }; typedef struct CGSize CGSize; |
. Das wiederum, wieder enthalten Typen CGFloat oder Typ float . Wenn wir analysieren den Code von CGRectMake () sind:
1 2 3 4 5 6 7 8 | CG_INLINE CGRect CGRectMake (CGFloat x, y CGFloat, CGFloat Breite, Höhe CGFloat) { CGRect rect; y; rect.origin.x = x, y = rect.origin.y; height; rect.size.width = width, height = rect.size.height; Rückkehr rect; } |
Daraus folgt, dass dieses Stück Code:
1 2 3 4 | [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 12 , 409 , 100 , 40 ) ; gbutton.frame = CGRectMake (12, 409, 100, 40); @ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Presse" Forst: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Es könnte zu Recht geschrieben werden als:
1 2 3 4 | [ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton gbutton * = [UIButton buttonWithType: UIButtonTypeRoundedRect]; CGRect ) { 12 , 409 , 100 , 40 } ; gbutton.frame = (CGRect) {12, 409, 100, 40}; @ "Press" forState : UIControlStateNormal ] ; [Gbutton setTitle: @ "Presse" Forst: UIControlStateNormal]; gbutton ] ; [MainWindow addSubview: gbutton]; |
Nur um die Dinge zu beschleunigen "der Code ausgeführt wird ... ![]()
Xcode Verknüpfung
Xcode ist eine wirklich gute Entwicklungsumgebung, schön und voller Details, die das Schreiben effizienter Code und angenehmer machen. Unter diesen ist die Leichtigkeit der automatischen Vervollständigung bei der Eingabe, insbesondere beim Schreiben von Anwendungen für Apple iPhone, wo die Rahmenbedingungen sind vielfältig und erinnern Syntax und Nomenklatur Unternehmens durch ein paar.
Xcode: Debugging Tipps Preferences
Mit der Xcode-Einstellungen können Sie das Verhalten der Atmosphäre während des Debugging-Phase einer iPhone-Applikation eingestellt. Die Standardeinstellungen in der Tat sehr unangenehm, wenn Sie versuchen, versuchen Sie es erneut einen Antrag, zum Beispiel nach dem Start unserer Applikation, müssen Sie manuell öffnen Sie das Fenster für die Konsole auf den Ausgang verschiedener siehe NSLog() . Xcode lässt auch den vorherigen Sitzungen, um uns zu zwingen, das Fenster von Hand zu reinigen. Glücklicherweise können Sie das Problem, indem sie auf die Einstellungen zu lösen:

Wie oben gezeigt, wählen Sie einfach ein Element aus dem Menü auf Start, um zu entscheiden, welche Debug-Fenster automatisch geöffnet beim Start unserer gültig, wenn (I & Debugger Console eingestellt, aber Sie diejenigen, die am besten Sie wählen können). Auf der rechten Seite, dann finden wir Auto Clear Debug-Konsole, so dass Sie immer mit einem sauberen Konsole zu starten.
iPhone SecondApp: Guess der Zahl - Teil 2
Wie bereits erwähnt FirstApp iPhone: Guess der Zahl - Teil 1 sehen wir, wie Sie eine Anwendung für das Apple iPhone ohne Interface Builder zu machen! In der Tat werden wir beseitigen physischen Dateien, die von Interface Builder, Xcode-Assistenten erstellt. Am Ende von diesem Post, dann haben wir eine Anwendung in jeder Hinsicht identisch, wie in der ersten Hälfte erreicht, mit dem Unterschied, dass wir alle unsere visuelle Komponenten, darunter das Hauptfenster, vollständig zu erreichen, um Code.
Die Anwendung bereits, wenn Sie gerade herunterladen möchten, gibt es auf meiner Google-Code-Repository:
Ich möchte darauf hinweisen, sofort als ZIP diesem Beispiel mit einem Gewicht von weniger als das letzte Mal! ![]()
Wir schaffen das Projekt
Wir beginnen mit der Erstellung unseres Projektes SecondApp (um es von FirstApp zu unterscheiden), obwohl dieses Zeitfenster-basierten Anwendung zu wählen:

Nun wollen wir löschen alles, was mit Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Löschen Sie die Datei MainWindow.xib , in den Ordner Resources : auch löschen aus dem Dateisystem, und wählen Sie dann auch den Papierkorb verschieben. nella casella Main nib file base name : Wählen Sie dann die Datei SecondoApp-info.plist und löschen Sie den Verweis auf die MainWindow nib box Main-base file name:

An diesem Punkt haben wir nicht mehr jedem Windows-, zumindest über Interface Builder. , e modifichiamo la funzione main() in questo modo: So öffnen wir die Datei main.m , in Lage Other Sources , und ändern Sie die Funktion main() wie folgt aus:
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]; / / Durch das Entfernen der Datei. XIB verpassten wir den Punkt / / Delegierter des JPA, dann übergeben Sie es an "Hand" UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int retVal = UIApplicationMain (argc, argv, nil, @ "SecondAppAppDelegate"); ; [Pool release]; Rückkehr retVal; } |
Öffnen SecondAppAppDelegate.me erstellen Sie dann im Hauptfenster in Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | void ) applicationDidFinishLaunching : ( UIApplication * ) application { - (Void) applicationDidFinishLaunching: (UIApplication *) Anwendung { / / Holen Sie sich die Bildschirmgröße (320, 480) UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[UIScreen Hauptseite] applicationFrame]; / / Fenster erzeugen - wie wir in Interface Builder getan haben bye bye [ [ UIWindow alloc ] initWithFrame : windowRect ] ; MainWindow UIWindow * = [[UIWindow alloc] initWithFrame: windowRect]; / / Stellen Sie die Hintergrundfarbe des Fensters zu gelb, zu differenzieren / / Die bisherige Anwendung FirstApp [ UIColor yellowColor ] ] ; [MainWindow setBackgroundColor: [UIColor yellowColor]]; mainWindow ] ; [Self setWindow: MainWindow]; ; [Window makeKeyAndVisible]; ; [MainWindow release]; } |
Sie können bereits die Anwendung zu testen, wenn Sie ein gelbes Fenster hast du alles richtig machen!
, necessario solo se si usa Interface Builder. In der Datei SecondAppAppDelegate.h können wir beseitigen IBOutlet nur erforderlich, wenn Sie Interface Builder verwenden. Auch hier hinzufügen, dass unsere globale Variablen, die letzte Zeit, die wir in den Controller eingegeben hatte. Dann ändern Sie die Datei SecondAppAppDelegate.h :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # Import <UIKit/UIKit.h> NSObject <UIApplicationDelegate> { @ Interface SecondAppAppDelegate: NSObject {<UIApplicationDelegate> UIWindow * window; UITextField * Zahl; UIButton * Taste; numeroACaso int; } nonatomic, retain ) UIWindow * window; @ Property (atomare, behalten) UIWindow * window; void ) controllaNumero; - (Void) getNumber; @ End |
, in quanto non stiamo usando Interface Builder. Wieder haben wir die Definition der Methode zubereitet controllaNumero , wie beim letzten Mal, aber wir haben den Hinweis beseitigt IBAction , weil Sie sich nicht mit Interface Builder.
Wir bilden die Schnittstelle von Code
Es ist Zeit, um Code mit allen Komponenten unserer Schnittstelle zu erstellen. ed inseriamo il seguente codice: Gehen wir zurück zu der Datei SecondAppAppDelegate.m , posizioniamoci vor [mainWindow release] und fügen Sie den folgenden Code ein:
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 | / / Erstellen der Titelleiste [ [ 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: @ "Guess eine Reihe"]; navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animated: NO]; myNavigationBar ] ; [Window addSubview: myNavigationBar]; / / Erstellen der Etiketten [ [ 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 = @ "Das iPhone hat eine Reihe von 1 bis 10 konzipiert, versuchen zu erraten?" myLabel ] ; [Window addSubview: myLabel]; / / Erstellen von Text-Eingabe UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; number = [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)]; numero.borderStyle = UITextBorderStyleRoundedRect; numero.textAlignment = UITextAlignmentCenter; numero.keyboardType = UIKeyboardTypeNumberPad; "Inserisci il numero" ; numero.placeholder = @ "Geben Sie die Nummer"; numero ] ; [Window addSubview: number]; / / Erstellen der Taste UIButton buttonWithType : UIButtonTypeRoundedRect ] ; button = [UIButton buttonWithType: UIButtonTypeRoundedRect]; 10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30); @ "Premi qui" forState : UIControlStateNormal ] ; [Button setTitle: @ "Hier klicken" Forst: UIControlStateNormal]; self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget Button: self Aktion: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside]; bottone ] ; [Window addSubview: Taste]; ; [MyLabel release]; ; [NavigationItem release]; ; [MyNavigationBar release]; |
della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Da die " applicationDidFinishLaunching entspricht viewDidLoad wie beim letzten Mal, kurz nach der [mainWindow release]; einzufügen:
1 | + arc4random ( ) % 10 ; numeroACaso arc4random = 1 + () 10%; |
Jetzt können wir tun, ist die Methode zu implementieren controllaNumero , die gleich wird (abgesehen von den Prototyp) zu, die verwendet werden letzte Mal:
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 (@ "-Taste gedrückt Kontrollnummer"); [ numero.text integerValue ] ; numeroInserito = int [numero.text integerWert]; message; NSString * message; "Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "Die eingegebene Zahl ist% d", numeroInserito); numeroInserito <numeroACaso ) { if (numeroInserito <numeroACaso) { "Troppo basso..." ; message = @ "Too Low ..."; ( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) { "Troppo alto..." ; message = @ "Zu hohe ..."; ( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) { "Bravo hai indovinato" ; message = @ "Bravo, Sie haben es erraten"; + arc4random ( ) % 10 ; numeroACaso arc4random = 1 + () 10%; "Numero pensato %d" , numeroACaso ) ; NSLog (@ "Number% d dachte:" numeroACaso); } [ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc] "Responso" initWithTitle: @ "Response" Nachricht: Nachricht Delegierter: nil "OK" cancelButtonTitle: @ "OK" ] ; otherButtonTitles: nil]; ; [AlertMessaggio show]; ; [AlertMessaggio release]; "" ; numero.text @ = ""; } |
Wir sind fertig!
Schlussfolgerungen und Überlegungen
, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Dieses Beispiel macht nicht den direkten Einsatz eines UIView oder UIViewController , nur weil ich überlasse es so einfach und einheitlich wie möglich wollte und auch, um zu zeigen, dass die Elemente nicht immer notwendig. Allerdings Einfügen von Objekten direkt in das Fenster kann einen Sinn haben in diesem Beispiel und andere sporadische Kontexten. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. Die Verwendung von UIView und UIViewController Vorteile bringen in vielen anderen Fällen jedoch sind einige nahezu unverzichtbar Ein, wie wir in die Zukunft sehen.
XCode: organisieren Sie Ihren Code mit der # pragma markiert
XCode ist eine sehr leistungsstarke und vielseitige und bietet dem Programmierer mit vielen nützlichen Features und einfach zu bedienen. Beim Schreiben von komplexem Code, oder zumindest artikuliert, ist es wichtig, Ihren Code zu organisieren, so dass Sie nicht verschwenden keine Zeit Suchfunktionen in langen Zeilen Code zu verbreiten. Nach kommentieren, die erste und wichtigste Sache zu tun, bietet die Umgebung XCode-Richtlinien (nice), um die Nutzbarkeit und legginilità innerhalb der Entwicklung zu verbessern. Eines davon ist die Richtlinie #pragma mark , die sehr nützlich bei der Organisation von Gruppen der Code und Methoden wird.
In der Abbildung unten sehen Sie den Code Teil meines Projektes PragmaTest :

Die Top-Dropdown-Menü können Sie alle Methoden der Klasse Liste. Nun, wenn wir unsere Methode insert über die Richtlinie #pragma mark das eine Syntax:
1 | # Pragma Marke {label} |
Wir erhalten:

Die erste #pragma mark mit einem Bindestrich (-) fügt eine Trennlinie. Der zweite ist ein Text (Label) zu schmecken. Sie können die folgende Anweisung hinzu, wo Sie wollen, organisieren Sie den Code, wie Sie sehen, passen. Sie können pragmatischer Zeilen ein:
1 2 3 4 5 6 | # Pragma Marke - # Pragma mark / ** # Pragma markiert * Mit dem Pragma # Pragma Markierung * auf mehreren Zeilen Code # Pragma Zeichen * / void ) mioMetodo { } - (Void) {} myMethod |
Apple iPhone: Das erste Release 1.2

Erhältlich im AppStore zu aktualisieren, um die Version 1.2 von ihrerstes . Hier sind die Release Notes:
- Voll in die Grafik des Spiels überarbeitet, die jetzt viel angenehmer
- Kompatibel mit Apple iPhone 3.0
- Hinzugefügt Sound-Effekte
- Überarbeitete und verbesserte die Schiffbarkeit des Spiels und Anweisungen
iPhone: alle Systemschriften
Das Apple iPhone bietet eine begrenzte Anzahl von Schriften für Entwickler. Die Liste der verfügbaren Schriften ist leicht durch den Code erreicht, wie wir sehen werden. Wenn Sie Ihre eigenen Schriftarten, wie z. B. die Aufnahme in den Ressourcen nutzen wollen, ist es ein wenig mehr zu artikulieren und conivolge auch die Erteilung von Lizenzen (Rechte) "einbetten" Schriftarten ... wir reden später. Drehen statt auf die offiziellen Quellen in der iPhone sind sie (auf Bild klicken zum Vergrößern):
Das Apple iPhone SDK ermöglicht den Zugriff auf die speziellen System-Fonts. Diese werden durch spezielle Konstanten identifiziert und sind:
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]; |
Wenn Sie tatsächlich einen Zeiger auf eine ODEI Schriften im Bild oben gezeigt verwenden:
1 | [ UIFont fontWithName : @ "Helvetica-Bold" size : 22.0 ] ; UIFont myCustomFont * = [UIFont fontWithName: @ "Helvetica-Bold" Größe: 22,0]; |
Wie Sie sehen können die Verwaltung der Schriftarten ist das Besondere, neben der Familie (Helvetica, Courier, etc ...) müssen die Art (fett, kursiv, etc. angeben ...). In der Praxis muss daher eine Schrift mit diesen Merkmalen ausgestattet werden. Die Helvetica, zum Beispiel, wird vertreten durch:
1 2 3 4 | Helvetica Helvetica-Bold Helvetica-Oblique Helvetica-BoldOblique |
Wenn Sie Ihre Schriften direkt auf dem iPhone anzeigen lassen möchten, sind hier einige nützliche Code-Zeile:
1 2 3 4 5 6 7 8 9 10 11 12 | listOfFonts = [ [ NSArray alloc ] initWithArray : [ UIFont familyNames ] ] ; NSArray * listOfFonts = [[ NSArray alloc] initWithArray: [UIFont Familiennamen]]; subFontTypes; NSArray * subFontTypes; int i = 0 ; i< [ listOfFonts count ] ; i ++ ) { for (int i = 0; i <[listOfFonts count]; i + +) { "Font Family: %@" , [ listOfFonts objectAtIndex : i ] ) ; NSLog (@ "Schriftfamilie:% @", [listOfFonts objectAtIndex: i]); NSArray alloc ] initWithArray : [ UIFont fontNamesForFamilyName : [ listOfFonts objectAtIndex : i ] ] ] ; subFontTypes = [[ NSArray alloc] initWithArray: [UIFont fontNamesForFamilyName: [listOfFonts objectAtIndex: i]]]; int j = 0 ; j< [ subFontTypes count ] ; j ++ ) { for (int j = 0 j <[subFontTypes count] j + +) { "+----->Type: %@" , [ subFontTypes objectAtIndex : j ] ) ; NSLog (@ "+-----> Type:% @ ", [subFontTypes objectAtIndex: j]); } ; [SubFontTypes release]; } ; [ListOfFonts release]; |
Mit dem SDK 2.2.1 auf meinem Simulator, bekam ich:
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 | Schriftfamilie: Courier +-----> Typ: Courier +-----> Typ: Courier-BoldOblique +-----> Typ: Courier-Oblique +-----> Typ: Courier-Bold Schriftfamilie: AppleGothic +-----> Typ: AppleGothic Schriftfamilie: Arial +-----> Typ: ArialMT +-----> Typ: Arial-BoldMT +-----> Typ: Arial-BoldItalicMT +-----> Typ: Arial-ItalicMT Schriftfamilie: sthe TC +-----> Typ: Light-STHeitiTC +-----> Type: Medium-STHeitiTC Schriftfamilie: Hiragino Kaku Gothic Pron +-----> Typ: HiraKakuProN-W6 +-----> Typ: HiraKakuProN-W3 Schriftfamilie: Courier New +-----> Typ: CourierNewPS-BoldMT +-----> Typ: CourierNewPS-ItalicMT +-----> Typ: CourierNewPS-BoldItalicMT +-----> Typ: CourierNewPSMT Schriftfamilie: Zapfino +-----> Typ: Zapfino Schriftfamilie: Arial Unicode MS +-----> Typ: ArialUnicodeMS Schriftfamilie: sthe SC +-----> Type: Medium-STHeitiSC +-----> Typ: Light-STHeitiSC Schriftfamilie: American Typewriter +-----> Typ: AmericanTypewriter +-----> Typ: AmericanTypewriter-Bold Schriftfamilie: Helvetica +-----> Typ: Helvetica-Oblique +-----> Typ: Helvetica-BoldOblique +-----> Typ: Helvetica +-----> Typ: Helvetica-Bold Schriftfamilie: Marker Felt +-----> Typ: Thin-MarkerFelt Schriftfamilie: Helvetica Neue +-----> Typ: HelveticaNeue +-----> Typ: HelveticaNeue-Bold Schriftfamilie: DB LCD Temp +-----> Typ: DBLCDTempBlack Schriftfamilie: Verdana +-----> Typ: Verdana-Bold +-----> Typ: Verdana-BoldItalic +-----> Typ: Verdana +-----> Typ: Verdana-Italic Schriftfamilie: Times New Roman +-----> Typ: TimesNewRomanPSMT +-----> Typ: TimesNewRomanPS-BoldMT +-----> Typ: TimesNewRomanPS-BoldItalicMT +-----> Typ: TimesNewRomanPS-ItalicMT Schriftfamilie: Georgia +-----> Typ: Georgia-Bold +-----> Typ: Georgien +-----> Typ: Georgia-BoldItalic +-----> Typ: Georgia-Italic Schriftfamilie: sthe J +-----> Type: Medium-STHeitiJ +-----> Typ: Light-STHeitiJ Schriftfamilie: Arial Rounded MT Bold +-----> Typ: ArialRoundedMTBold Schriftfamilie: Trebuchet MS +-----> Typ: TrebuchetMS-Italic +-----> Typ: TrebuchetMS +-----> Typ: Trebuchet-BoldItalic +-----> Typ: TrebuchetMS-Bold Schriftfamilie: sthe K +-----> Type: Medium-STHeitiK +-----> Typ: Light-STHeitiK |
Wie NSLog () von der Quelle XCode löschen
<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> eine nützliche Funktion in den frühen Phasen eines Projekts zum Testen und Debuggen einer Anwendung für Apple iPhone oder ganz allgemein in die XCode-Umgebung. Da nur eine Funktion, genau wie die anderen, wird seine Anwesenheit auch zu spüren sein, wenn die Freigabe (Release) unserer ausführbar. potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all'interno di loop. Es wird dann notwendig, zu entfernen, in gewisser Weise alle Zeilen in NSLog() aus dem Code entfernen, weil sie nicht mehr benötigt wird, und weil Anrufe an NSLog() konnte die Leistungsfähigkeit unserer Anwendung auswirken, insbesondere wenn wir setzen NSLog() , um "inneren Schleife.
Unmittelbar auszuschließen Lösung für das "Look" und "Abbrechen", weil es eines Tages wieder verwendet werden könnten. Wir schließen die Lösung der "Look" und "Kommentare", unbequem aus dem gleichen Grund wie zuvor. Zum Glück, eine saubere, einfache, und den richtigen Compiler conditionals. Was wir in der Praxis zu tun, und sagen, dass der Compiler auszuschließen - wenn es einen bestimmten Zustand - bei der Erstellung unserer Quelle Linien enthalten NSLog() .
Die Compiler-Direktiven und Compiler bedingte Anweisungen, sind ein sehr mächtiges und weit verbreitet. Diejenigen, die aus der Entwicklung der ANSI-C sehr gut kennt und wird definitiv in vielen Situationen utilizzte. Die Besonderheit dieser "Anleitung" liegt in der Tatsache, oben erwähnt, durch den Compiler zu sehen und nicht ausführbar. Diese Eigenschaft macht sie in vielen Fällen nützlich und kann Probleme lösen, sonst sehr ärgerlich.
Lassen Sie uns ein Beispiel-Code, der, wie vorhergesagt, Sie "Löschen" kann von der Erstellung von Code-Share, in unserem Fall sehen NSLog() :
1 2 3 4 5 6 | # Define ACTIVE_NSLOG 1 / / Wenn die Konstante definiert ist ACTIVE_NSLOG füllen / / Der Block von Code zwischen # ifdef und # endif # Ifdef ACTIVE_NSLOG " ... bla bla" ) ; NSLog (@ "... blah blah"); # Endif |
). Bedingte Anweisungen sind Teil des Compilers von der gleichen Familie wie #define , auch in der Tat, werden durch ein "Pfund" (vorausgegangen # ). solo se ACTIVE_NSLOG è definito. In dem gezeigten Beispiel haben wir eine Konstante definiert ACTIVE_NSLOG ; nachfolgenden Zeilen Code weist den Compiler an "include" Zeile NSLog() nur dann, wenn ACTIVE_NSLOG definiert ist. Wenn wir kümmerten, während des Schreibens von unseren Code, um Anrufe zu NSLog() innerhalb des Blocks #ifdef ... #endif per far sparire, alla prossima compilazione, tutti i nostri NSLog() . #ifdef ... #endif , löschen Sie einfach die Definition der konstanten ACTIVE_NSLOG zu verschwinden, die nächste Compilation, alle unsere NSLog() .
Ein bestes und endgültiges
Lassen Sie uns nun sehen, wie die XCode-Umgebung eingerichtet, um noch mehr, was wir hier getan haben, zu verbessern! Zuerst wählen wir einen konstanten Namen, die wir in unseren Projekten zu verwenden, um aus der Kompilierung ausschließen NSLog() . o quello che preferite. Sie können wählen, den Namen, den Sie möchten, von DEBUG zu MIO_DEBUG oder was auch immer Sie bevorzugen. Öffnen Sie Ihr Projekt, neu oder alt. Geben Sie alle NSLog() innerhalb des Blocks (oder Block):
1 2 3 | # Ifdef MIO_DEBUG " ... bla bla" ) ; NSLog (@ "... blah blah"); # Endif |
Wählen Sie die Haupt-Datei Ihres Projekts, klicken Sie die rechte Maustaste und wählen Sie das Get Info Element.

Es öffnet sich das Fenster mit Informationen über das Projekt:

Wählen Sie das Register Erstellen, überprüfen Sie, ob Sie in der Debug-Konfiguration (das ist die Perle) sind, um die User-Defined Abschnitt und fügen über den Button unten links, ein neues Feld namens OTHER_CFLAGS . Bei diesem Wert assegnamoli -DMIO_DEBUG=1 . Die Syntax ist -D{mia define}=1 .
Dieses Verfahren hat zwei Vorteile:
- Wir dürfen nicht in den Code eingefügt,
#define MIO_DEBUG 1, aber wir tun es durch das Projekt Informationen. Also, wenn wir füllen die Release-Version (die man ohne unterwegsNSLog()zu tun) nicht daran denken, die Zeile zu löschen#define MIO_DEBUG 1 - Die Konstante ist in Bezug auf die Konfiguration, in unserem Fall Debug definiert. So wird die Umstellung auf Konfiguration (release) Release fehlen und die ständige Zeilen mit
NSLog()wird nicht kompiliert werden
Schlussfolgerungen
Das oben beschriebene Verfahren kann in einer moltidutine anderen Fällen nützlich sein, mit NSLog() , nichts zu tun haben. Bedingte Anweisungen helfen kann der Compiler in einer Vielzahl von Kontexten. Sie werden oft von Programmierern verwendet, um den Typ des Betriebssystems, die Version, das Ziel, die Präsenz der mathematischen Prozessoren, bestimmen unter Beibehaltung der gleichen "gleichen" Quelle.
Um zu verstehen, als Beispiel, können wir utilizzre unser ständiger MIO_DEBUG auch in anderen Bereichen des Codes zu intervenieren:
1 2 3 4 5 6 7 8 9 10 | / / Debug, wenn sie das Spiel zu gewinnen / / Mit einer Punktzahl von 100 statt 10000:) # Ifdef MIO_DEBUG score == 100 ) if (score == 100) # Else score == 10000 ) if (score == 10000) # Endif { ; [HaiVinto self]; } |
Zum Abschluss, hier sind einige Beispiele und Varianten:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | / / In der Regel gibt es # Wenn der Ausdruck / / If-Anweisung ähnlich der traditionellen, so mit einem vollen Ausdruck / / Überprüfen, ob eine Konstante definiert ist # Ifdef konstant / / Prüfen, ob es sich NICHT um eine definierte # Ifndef konstant / / Else # Else / / Schließen Sie den Baustein # Endif |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / / Zum Beispiel ... # Define DEBUG 1 5 # define MIA_ALTRA_COSTANTE ... # Wenn DEBUG / / In diesem Fill # Else / / Sonst füllen Sie dieses anderen # Endif # Wenn MIA_ALTRA_COSTANTE> 4 "..." ) ; NSLog (@ "..."); # Endif |
1 2 3 4 | # Ifndef INCLUDE_MIO_FILE # Define INCLUDE_MIO_FILE # Include "mio_file.h" # Endif |








Neueste Kommentare
Mark : @ Mark: Danke für die Antwort. Zum Beispiel, wenn Sie einen Code zum Speichern / haben Sie die Ordner ...
Mark : Danke für die Antwort. Zum Beispiel, wenn Sie einen Code zum Speichern / haben Sie die Ordner ...
Giovambattista Fazioli : @ Mark: Im Prinzip, absolut, hängt viel ab, wie und was zum Download bereit. La ..
Mark : Hallo, guter Führer! Ich wollte fragen, können Sie den gleichen Code, um eine SQL-Datenbank laufen? Statt ...
Joseph : Hallo Ich wollte Sie fragen, wie können Sie in der Post finde ich hochgeladen einer Galerie von 50 Bildern, zum Beispiel ...