thomas.dohmke.de - tagged with schnipsel http://thomas.dohmke.de/feed en-us http://blogs.law.harvard.edu/tech/rss Sweetcron thomas@dohmke.de iPhone Code Schnipsel: Kennung des Gerätes http://thomas.dohmke.de/items/view/321/iphone-code-schnipsel-kennung-des-gerates

Gesucht

Die Kennung (Identifier bzw. UDID) eines iPhone oder iPod Touch programmatisch ermitteln.

Lösung

UIDevice *device = [UIDevice currentDevice]; NSString *uniqueIdentifier = [device uniqueIdentifier];

UIDevice bietet außerdem Instanzmethoden zur Bestimmung von Name (name) und Modell (model) des Gerätes sowie Name (systemName) und Version (systemVersion) des Betriebssystems. Beispiel für mein iPhone:

Name: MyPhone Model: iPhone SystemName: iPhone OS SystemVersion: 2.2.1

]]>
Sat, 18 Apr 2009 13:11:00 +0200 http://thomas.dohmke.de/items/view/321/iphone-code-schnipsel-kennung-des-gerates
iPhone Code Schnipsel: Den Benutzer warten lassen http://thomas.dohmke.de/items/view/320/iphone-code-schnipsel-den-benutzer-warten-lassen

Gegeben

Der Benutzer füllt seine Benutzerdaten in zwei Textfelder ein und klickt dann auf Login. Anschließend wird ein Request an den Server gesendet und abhängig von der Antwort zum Hauptmenü gewechselt oder eine Fehlermeldung angezeigt.

Gesucht

Während des Wartens auf die Antwort soll die aktuelle Ansicht durch ein HUD mit einem UIActivityIndicatorView überlagert werden.

Lösung

Wir laden die Klasse SFHFHUDView in Form der beiden Dateien SFHFHUDView.h und SFHFHUDView.m von GitHub runter und binden diese in unser Xcode-Projekt ein. Anschließend kann das HUD wie folgt erzeugt und angezeigt

SFHFHUDView *HUDView = [[SFHFHUDView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [HUDView setStatusText:@"Connecting..."]; [HUDView setShowsStatusLabel:YES]; [HUDView startActivityIndicator]; [HUDView makeKeyAndVisible];

sowie später wieder entfernt werden:

[HUDView resignKeyWindow]; [HUDView setHidden:YES];

]]>
Fri, 17 Apr 2009 18:33:00 +0200 http://thomas.dohmke.de/items/view/320/iphone-code-schnipsel-den-benutzer-warten-lassen
iPhone Code Schnipsel: Eingestellte Sprache http://thomas.dohmke.de/items/view/319/iphone-code-schnipsel-eingestellte-sprache

Gesucht

Welche Sprache hat der Benutzer auf seinem iPhone oder iPod Touch eingestellt?

Lösung

NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; NSArray* allLanguages = [defaults objectForKey:@"AppleLanguages"]; NSString* currentLanguage = [allLanguages objectAtIndex:0];

currentLanguage enthält dann das Sprachkürzel nach ISO 639-1, z.B. de für Deutsch oder en für Englisch.

]]>
Fri, 17 Apr 2009 12:23:00 +0200 http://thomas.dohmke.de/items/view/319/iphone-code-schnipsel-eingestellte-sprache
iPhone Code Schnipsel: Erweitertes NSLog http://thomas.dohmke.de/items/view/249/iphone-code-schnipsel-erweitertes-nslog

Gegeben

Diverse Aufrufe von NSLog innerhalb eines iPhone-Projektes, z.B.

  • (void)applicationDidFinishLaunching:(UIApplication *)application { NSLog(@"App did finish launching.");

    // ...

    Gesucht

    In der Debug-Konfiguration soll zusätzlich Dateiname und Zeilennummer ausgegeben werden, in der Release-Konfiguration soll hingegen die Ausgabe deaktiviert werden.

    Lösung

    Inspiriert durch John Muchows Blogpost Filename and Line Number with NSLog: Part II und wie folgt abgewandelt:

LogHelper.h:

if DEBUG

define CMLog(format, ...) [LogHelper logWithPath:FILE line:LINE string:(format), ## VA_ARGS]

else

define CMLog(format, ...)

endif

@interface LogHelper : NSObject { }

  • (void)logWithPath:(char *)path line:(NSUInteger)line string:(NSString *)format, ...;

LogHelper.m:

import "LogHelper.h"

@implementation LogHelper

  • (void)logWithPath:(char *)path line:(NSUInteger)line string:(NSString *)format, ... { NSString *pathString = [[NSString alloc] initWithBytes:path length:strlen(path) encoding:NSUTF8StringEncoding];

    va_list argList; va_start(argList, format); NSString *formattedString = [[NSString alloc] initWithFormat:format arguments:argList]; va_end(argList);

    NSLog([NSString stringWithFormat:@"%@ (%d): %@", [pathString lastPathComponent], line, formattedString]); [formattedString release]; }

@end

Unter Target > AppName > Get Info ist dann im Reiter Build für die Konfiguration Debug die Einstellung Other C Flags mit -DDEBUG zu ergänzen und im Code NSLog durch CMLog zu ersetzen.

]]>
Sun, 15 Mar 2009 16:11:00 +0100 http://thomas.dohmke.de/items/view/249/iphone-code-schnipsel-erweitertes-nslog
iPhone Code Schnipsel: Hinweis nur einmal anzeigen http://thomas.dohmke.de/items/view/243/iphone-code-schnipsel-hinweis-nur-einmal-anzeigen

Gesucht¶

Beim ersten Start der App soll der Benutzer einmalig eine Meldung erhalten.

Lösung¶

Man nehme die Klassen UIAlertView und NSUserDefaults und rührt ein wenig um:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSString *showScrollingHint = [defaults stringForKey:@"LaunchMessage"]; if ((!showScrollingHint) || ([showScrollingHint isEqualToString:@"YES"])) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Message" message:@"If you like this app, tell it to all your friends." delegate:self cancelButtonTitle:@"Alrighty" otherButtonTitles:nil, nil]; [alert show]; } [defaults setObject:@"NO" forKey:@"LaunchMessage"];

Bei Bedarf kann man zusätzlich ein Settings.bundle erstellen, so dass der Benutzer die Einstellung zurücksetzen kann und damit den Hinweis erneut angezeigt bekommt.

]]>
Thu, 12 Mar 2009 22:03:00 +0100 http://thomas.dohmke.de/items/view/243/iphone-code-schnipsel-hinweis-nur-einmal-anzeigen
iPhone Code Schnipsel: Link aus UIWebView in MobileSafari öffnen http://thomas.dohmke.de/items/view/236/iphone-code-schnipsel-link-aus-uiwebview-in-mobilesafari-offnen

Gegeben¶

In einem UIWebView wird ein String dargestellt (UIWebView bietet faktisch die einzige Möglichkeit auf dem iPhone, "Rich-Text" darzustellen):

NSString *path = [[NSBundle mainBundle] bundlePath]; NSURL *baseURL = [NSURL fileURLWithPath:path]; [webView loadHTMLString:HTMLString baseURL:baseURL];

Gesucht¶

Links innerhalb des Strings sollen sich bei Aufruf durch den Benutzer in MobileSafari öffnen.

Lösung¶

Delegate des UIWebView auf eine Subklasse von UIViewController setzen, dort die Methode webView:shouldStartLoadWithRequest:navigationType: definieren:

  • (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSRange range = [[[request URL] absoluteString] rangeOfString:@"file:///"]; if (range.location == 0) { return YES; }

    [[UIApplication sharedApplication] openURL:[request URL]]; return NO; }

    Die Abfrage auf "file:///" ist notwendig, da die Delegate-Methode auch beim Laden des eigentlichen Strings aufgerufen wird. In dem Fall ist der Rückgabewert YES, so dass das UIWebView die Darstellung startet. In allen anderen Fällen wird MobileSafari über openURL aufgerufen und NO zurückgegeben.

    Siehe auch¶

    iPhone Code Schnipsel: Link in MobileSafari öffnen

]]>
Tue, 10 Mar 2009 20:14:00 +0100 http://thomas.dohmke.de/items/view/236/iphone-code-schnipsel-link-aus-uiwebview-in-mobilesafari-offnen
iPhone Code Schnipsel http://thomas.dohmke.de/items/view/233/iphone-code-schnipsel

Unter der Rubrik iPhone Code Schnipsel veröffentlichen wir hier seit ein paar Tagen kurze Ausschnitte aus dem Code, die wir bei der täglichen Arbeit mit dem iPhone-SDK immer wieder mal brauchen. So können wir sie selbst schnell wiederfinden und möglicherweise hilft es auch dem ein oder anderen Leser weiter:

Subviews umdrehen Text überblenden Verfügbare Schriftarten ermitteln Link in MobileSafari öffnen

Fortsetzung folgt...

]]>
Mon, 09 Mar 2009 16:14:00 +0100 http://thomas.dohmke.de/items/view/233/iphone-code-schnipsel
iPhone Code Schnipsel: Link in MobileSafari öffnen http://thomas.dohmke.de/items/view/232/iphone-code-schnipsel-link-in-mobilesafari-offnen

Gegeben¶

Ein View mit einem Button:

  • (void)loadView { UIButton *button = //... [button addTarget:self action:@selector(openLink:) forControlEvents:UIControlEventTouchDown]; [view addSubview:button]; }

    Gesucht¶

    Beim Drücken des Buttons soll sich ein zuvor festgelegter Link (z.B. die Twitter-Seite des Entwicklers) in MobileSafari öffnen.

    Lösung¶

  • (IBAction)openLink:(id)sender { NSURL *url = [NSURL URLWithString:@"http://twitter.com/ashtom"]; [[UIApplication sharedApplication] openURL:url]; }

    Will man statt MobileSafari ins Mail-Programm springen, hilft ein mailto:-Link:

  • (IBAction)openLink:(id)sender { NSURL *url = [NSURL URLWithString:@"mailto:thomas@dohmke.de"]; [[UIApplication sharedApplication] openURL:url]; }

    Betreff und Inhalt der E-Mail können mit den üblichen mailto:-Optionen mit vordefinierten Werten ausgestattet werden.

]]>
Mon, 09 Mar 2009 15:55:00 +0100 http://thomas.dohmke.de/items/view/232/iphone-code-schnipsel-link-in-mobilesafari-offnen
iPhone Code Schnipsel: Verfügbare Schriftarten ermitteln http://thomas.dohmke.de/items/view/229/iphone-code-schnipsel-verfugbare-schriftarten-ermitteln

Gesucht¶

Alle auf dem iPhone verfügbaren Schriftarten.

Lösung¶

NSMutableArray *familyNames = [[NSMutableArray alloc] initWithArray:[UIFont familyNames]]; [familyNames sortUsingSelector:@selector(compare:)]; for (NSInteger index = 0; index < [familyNames count]; index++) { NSLog(@"Family name: %@", [familyNames objectAtIndex:index]); NSMutableArray *fontNames; fontNames = [[NSMutableArray alloc] initWithArray: [UIFont fontNamesForFamilyName: [familyNames objectAtIndex:index]]]; for (NSInteger subIndex = 0; subIndex < [fontNames count]; subIndex++) { NSLog(@"- Font name: %@", [fontNames objectAtIndex:subIndex]); } [fontNames release];
} [familyNames release];

]]>
Sat, 07 Mar 2009 19:57:00 +0100 http://thomas.dohmke.de/items/view/229/iphone-code-schnipsel-verfugbare-schriftarten-ermitteln
iPhone Code Schnipsel: Text überblenden http://thomas.dohmke.de/items/view/227/iphone-code-schnipsel-text-uberblenden

Gegeben¶

Ein Textfeld in Form einer UITextView:

UITextView *textView = [[UITextView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]]; [textView setText:@"Hello World."]; self.view = textView;

Gesucht¶

Der Aufruf von setText soll mit einem Überblendeffekt (englisch: fading) animiert werden.

Lösung¶

[CATransaction begin]; CATransition *animation = [CATransition animation]; animation.type = kCATransitionFade; animation.duration = 0.5; [textView setText:@"It's a sunny day."]; [[textView layer] addAnimation:animation forKey:@"fadeText"]; [CATransaction commit];

Der Wert von duration gibt die Dauer in Sekunden an, der Wert von type die Art der Animation. kCATransitionFade entspricht dem gewünschten Überblendeffekt. Mögliche Alternativen sind kCATransitionMoveIn (neuer Text bewegt sich rein), kCATransitionPush (neuer Text bewegt sich rein, alter Text bewegt sich raus) und kCATransitionReveal (neuer Text erscheint, alter Text bewegt sich raus).

]]>
Fri, 06 Mar 2009 16:12:00 +0100 http://thomas.dohmke.de/items/view/227/iphone-code-schnipsel-text-uberblenden
iPhone Code Schnipsel: Subviews umdrehen http://thomas.dohmke.de/items/view/221/iphone-code-schnipsel-subviews-umdrehen

Gegeben¶

Ein Fenster mit zwei Subviews:

[window addSubview:view1]; [window addSubview:view2];

Gesucht¶

Zwischen den Views wechseln und dabei eine Animation anzeigen, die ein Umdrehen symbolisiert.

Lösung¶

CGContextRef context = UIGraphicsGetCurrentContext(); [UIView beginAnimations:nil context:context]; [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; [UIView setAnimationDuration:1.0]; [window exchangeSubviewAtIndex:1 withSubviewAtIndex:0]; [UIView commitAnimations];

Will man von rechts nach links drehen, nimmt man UIViewAnimationTransitionFlipFromRight statt dem obigen UIViewAnimationTransitionFlipFromLeft.

]]>
Thu, 05 Mar 2009 15:06:00 +0100 http://thomas.dohmke.de/items/view/221/iphone-code-schnipsel-subviews-umdrehen