Hauptmenü

Werkzeuge

Kategorien

Archiv

Einhell

Kompass, Richtung, Geschwindigkeit und Position in einer iOS App

Erstellt in IPhone SDK am 26. Februar 2012 vom Daschmi

Möchte man den GPS Sensor und den Kompass für die Positions und Richtungsbestimmung benutzen, so kann das CoreLocation Framework verwendet werden. Als erstes muss man das Framework dem Projekt hinzufügen und anschließend in seine Klasse mit folgendem Code includieren:

#import <CoreLocation/CoreLocation.h> 

Nun muss man eine Delegate Klasse mit dem Interface CLLocationManagerDelegate implementieren. Hier gibt es zwei wesentliche Funktionen die man implementieren kann.

Um den Kompass zu nutzen muss folgende Funktion verwendet werden. Die Funktion bekommt newHeading übergeben, in diesem Objekt sind die Daten des Kompass und des Gyrosensors enthalten. Siehe auch iOS Referenz.

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading {

    NSLog(@"%@", newHeading);

}

Eine weitere Funktion kann implementiert werden um die Geschwidigkeit, Position und Richtung zu bestimmen.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {

NSLog(@"Position:       %f:%f", here.longitude, here.latitude);
NSLog(@"Richtung: %f", [newLocation course]);
NSLog(@"Geschwindigkeit in km/h %.2f", (newLocation.speed * 3.6));

}

Damit die Funktionen auch aufgerufen werden muss natürlich der Delegate definiert werden:

    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;

    // Für Geschwindigkeit, Richtung und Position
    [locationManager startUpdatingLocation];

    // Für Kompass und Gyrosensor Funktion
    [locationManager startUpdatingHeading];

Einstellungen mit dem iOS SDK speichern

Erstellt in IPhone SDK am 20. Januar 2012 vom Daschmi

Möchte man einfache Werte speichern, zum Beispiel bestimmte Einstellungen einer Applikation so können die Methoden des NSUserDefaults Objekts genutzt werden.

Werte speichern:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // Objekt holen
[defaults setObject:textField.text forKey:@"TextField"]; // Wert aus Textfield speichern in Schlüssel "TextField"
[defaults synchronize];

Werte laden

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // Objekt holen
textField.text = [defaults valueForKey:@"TextField"]; // Wert aus Schlüssel "TextField" holen und in das UITextField schreiben

Icon und Icontext einer App ändern

Erstellt in IPhone SDK am 12. Januar 2012 vom Daschmi

Um den Text, der unter dem App Icon angezeigt wird zu ändern muss der Schlüssel Bundle display name in der app.plist angepasst werden. Das Icon lässt sich mittels des Schlüssels Icon file anpassen.

UIButton innerhalb eines UIScrollView

Erstellt in IPhone SDK am 30. November 2011 vom Daschmi

Hat mein einen oder mehere UIButtons innerhalb eines UIScrollView so bekommt man das Problem das man über dem Button nicht scrollen kann. Dies kann durch folgende Methode auf dem UIScrollView abgeändert werden:

[sImageView setDelaysContentTouches:NO];

Alle UIViews von einem UIView entfernen

Erstellt in IPhone SDK am 30. November 2011 vom Daschmi

Um alle Views von einem anderen View zu entfernen kann folgender Code verwendet werde:

for (UIView *view in sImageView.subviews)
{
  [view removeFromSuperview];
}

Automatische Höhe eines UILabels

Erstellt in IPhone SDK am 25. November 2011 vom Daschmi

Um ein UILabel automatisch so hoch zu machen wie es der Inhalt erfordert kann folgender Code verwendet werden:

UILabel *lTitel = [[UILabel alloc] initWithFrame:CGRectMake(120, 0, 190, 0)];
NSString *text = @"Laanger Text mit vielen vielen Wörtern der nicht in das Label passt";
[lTitel setText:text];
[lTitel setBackgroundColor:[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0]];
[lTitel setNumberOfLines:0];
[lTitel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:11]];
CGSize labelsize = [text sizeWithFont:lTitel.font constrainedToSize:CGSizeMake(190, 2000.0) lineBreakMode:UILineBreakModeWordWrap];
lTitel.frame = CGRectMake(120, 10, 190, labelsize.height);

XML Verarbeitung mit dem IPhone

Erstellt in IPhone SDK am 20. November 2011 vom Daschmi

Um eine XML Datei mit dem IPhone SDK zu verarbeiten kann der NSXMLParser in Verbingung mit dem Interface NSXMLParserDelegate verwendet werden. Möchte man beispielsweise eine XML Datei aus dem Web verarbeiten so kann folgender Aufruf verwendet werden:

dataParser = [[NSXMLParser alloc] initWithContentsOfURL:[NSURL URLWithString:strURL]];
[dataParser setDelegate:self];
[dataParser parse];
[dataParser release];

In dem Beispiel implementiert die Klasse des aufrufenden Objekts das Interface NSXMLParserDelegate.

Mit folgenden Funktionen kann man Textinhalte aus den XML Knoten verarbeiten:


- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{

 if ([elementName isEqualToString:@"immobilie"])
 {

 immobilie = [[Immobilie alloc] init];

 }

 strPath = [strPath stringByAppendingPathComponent:elementName];

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

 if ([strPath isEqualToString:@"openimmo/immobilie/geo/plz"])
 {
 NSLog(string);
 }

}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{

 strPath = [strPath stringByDeletingLastPathComponent];

}

Im Beispiel wird in der Variable strPath der Pfad innerhalb des XML gespeichert.

urlencode/urldecode in ObjectivC

Erstellt in IPhone SDK am 19. November 2011 vom Daschmi

Um einen String per GET zu übergeben muss er codiert werden. Dies kann folgende Funktion erledigen:

- (NSString *)urlencode:(NSString *)value {

    return (NSString *)CFURLCreateStringByAddingPercentEscapes(
        nil,
        (CFStringRef)value,
        nil,
        (CFStringRef)@"!*'();:@&=+$,/?%#[]",
        kCFStringEncodingUTF8
    );

}

In iOS5:

- (NSString *)urlencode:(NSString *)value {

    NSString *strReturn = (__bridge NSString *)CFURLCreateStringByAddingPercentEscapes(
                                                                              nil,
                                                                              (__bridge CFStringRef)value,
                                                                              nil,
                                                                              (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                              kCFStringEncodingUTF8
                                                                              );

    return strReturn; 

}

Das decodieren kann man mit folgender Funktion erreichen:

- (NSString *)urldecode:(NSString *) value {

 NSString *result = [(NSString *)value stringByReplacingOccurrencesOfString:@"+" withString:@" "];
 result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

 return result;

}

UIPickerView in einem UIActionSheet

Erstellt in IPhone SDK am 19. November 2011 vom Daschmi

Um ein Pickerview zum Beispiel als Modalen Dialog zur Auswahl eines Wertes zu nutzen kann ein UIActionSheet verwendet werden.

Zu erst muss das ActionSheet und den UIPickerView instanziieren:

UIActionSheet *pickerActionSheet = [[UIActionSheet alloc]
  initWithTitle:nil
  delegate:self
  cancelButtonTitlte:nil
  destructiveButtonTitle:nil
  otherButtonTitles:nil];

UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 244, 320, 216)];

In meinem Beispiel verwende ich noch eine UINavigationBar um das ActionSheet zu schließen und die Auswahl zu übernehmen, diese werden wie folgt instanziiert:

UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 200, 320, 44)];
UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Fertig" style:UIBarButtonSystemItemDone target:self action:@selector(closePickerAction:)];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@""];
item.rightBarButtonItem = closeButton;
item.hidesBackButton = YES;

Im Beispiel sieht man auch wie man den @selector verwendet um ein Event auf einen Button zu legen. Target ist dabei das Objekt wo die Methode closePickerAction aufgerufen wird.

Die Elemente müssen nun noch auf das ActionSheet gelegt werden und das ActionSheet zur Anzeige gebracht werden:

[pickerAction addSubview:navBar];
[pickerAction addSubview:pickerView];

[pickerAction showInView:self.view];
[pickerAction setFrame:CGRectMake(0, 0, 320, 480)];

[navBar release];
[closeButton release];
[item release];
[pickerView release];
[pickerAction release];

Werte in Dateien speichern und laden

Erstellt in IPhone SDK am 10. September 2011 vom Daschmi

Um Daten in einer Datei zu schreiben und dann wieder auszulesen empfielt sich das XML Format. Das IPhone SDK stellt bei vielen Datentypen entsprechende Methoden zur verfügung. Ich zeige es hier am Beispiel des Datentypes NSMutableDictionary, es ist aber auch für viele andere Datentypen möglich.

Daten Speichern

NSMutableDictionary *data = [[NSMutableDictionary alloc] init];
[data setObject:[NSString stringWithFormat:@"%f", 0.5] forKey:@"dVMin"]; // Wert in Objekt speichern

NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [path objectAtIndex:0];
NSString *filename = [documentsDir stringByAppendingPathComponent:@"Einstellung.xml"];

[data writeToFile:filename atomically:YES]; // Datei schreiben
[data release];

Daten laden

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
NSString *filename = [documentsDir stringByAppendingPathComponent:@"Einstellung.xml"]; // Der Dateiname

NSMutableDictionary *data = [NSMutableDictionary dictionaryWithContentsOfFile:filename];

NSLog(@"%@", [data objectForKey:@"dVMin"]); // Anzeige des Wertes für Schlüssel dVMin