Category 'Mobile'


iPad: handle boot screens

Apple iPhone and iPod were used to manage a single image file to load the application, the file Default.png . Apple iPad, however, the different management orientation requires the use of multiple image files, to be sure you see the splash screen correctly based on the orientation of the device. During application startup, as was the case for the iPhone, it is not possible to intervene to code for "wonder" as the device-oriented. Fortunately it was introduced in automatic loading of special files depending on the orientation:

The files are currently supported, in addition to the classic Default.png do not recommend to use because it is scaled and deformed according to guidance, are:

  • 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. Versions PortraitUpsideDown , LandscapeLeft and LandscapeRight can be used to determine orietamento and toward the latter.

Application to start, then, as recommended by Apple, it's good "redesign" - where necessary - our views acting within application:didFinishLaunchingWithOptions .

Continued ...

setAnimationDidStopSelector: different uses and advanced

In most cases, or because we are used or because we have seen in tutorials and in some texts, we use the setAnimationDidStopSelector in this manner:

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

; myView.alpha = 0;

; [UIView commitAnimations];

/ /

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

come delegato e tramite la setAnimationDidStopSelector gli invia un messaggio removeView quando l'animazione è terminata. In the code above the setAnimationDelegate set self as delegate and through setAnimationDidStopSelector sends a message removeView when the animation is finished. The code itself is correct, however, makes use of a message definition ( removeView ) that could be omitted. Now, here is the same code, with the same effect, without the message removeView :

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

; myView.alpha = 0;

; [UIView commitAnimations];

! The interesting thing about this approach is that myView could be a subclass of UIView ! It may therefore be a custom class with our own messages and, as stated, easily callable from setAnimationDidStopSelector . In addition, the setAnimationDidStopSelector selectors agree with parameters:

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

; myView.alpha = 0;

; [UIView commitAnimations];

This example can be extended to all cases here where we set a delegate, Atro is not a pointer to an instance of any object.

Continued ...

How to locate images and views in Interface Builder

After explaining how to locate our strings in Xcode , it is easy to see now how - by applying the same technique - to locate and view images / interfaces created with Interface Builder.

Locate graphics resources

The process, as mentioned, is the same, if we have an image already included in our resources, or they insert a new one, and we want to "locate" - that is, to manage two or more images based on the languages ​​supported - just click the button Right image ( Adium.png in this example) and select Get Info:

Make File Localizable we click in the lower left.

We click on Add and insert Localization Italian :

In order to obtain:

esattamente come accadeva con il testo: Our image is moved (physically, one of the rare times when that happens nell'alberatura Xcode is reflected on the filesystem) under virtual folders English.lproj and Italian.lproj exactly as happened with the text:

contiene una stessa versione dell'immagine. At this point each of the folders English.lproj and Italian.lproj contains the same version of the image. This image is manipulated in Interface Builder, where we will see - by default - the English version.
At this point, just overwrite one (or both files Adium.png ) to obtain a location of images "flash".

Locate the files XIB

Even the interfaces built with Interface Builder can be located in their entirety, when it is deemed necessary. ) con interfaccia XIB , lo selezioniamo, scegliamo Get Info dal menu contestuale, rendiamo il file localizzabile, aggiungiamo la localizzazione in italiano: The procedure is identical to that performed with the graphical capabilities: add a ViewController (eg infoViewController ) XIB interface, we select it, choose Get Info from the contextual menu, give the file localizable, add the Italian localization:

ViewController

Clicking Italiano or Italian will open Interface Builder! ) all'interno della classica cartella Classes . This time, the filesystem, you will notice that you have created two directories ( English.lproj and Italian.lproj ) within the classical Classes folder. Both will have their files infoViewController.xib . The comfort in this, clearly resolved in the code, and when we're going to instantiate our controller code we will have a "clean" like this:

1
2
[ InfoViewController alloc ] ; InfoViewController * info = [InfoViewController alloc];
info.view ] ; [Self.view addSubview: info.view];

As you can see there is no trace of any statement concerning the location, totally managed by the system. The two interfaces, of course, can be completely different, as are in effect as two separate XIB file.

Continued ...

Very short snippet: get the output of a URL in Objective-C

Perhaps I should write "Very very very, short snippets", however, is an excellent and convenient "trick" to show what I am. Running the "two" lines of code shown below, you can get the output of any URL and manipulate it.

Continued ...

10 useful snippets for Apple iPhone

Execute a method after n seconds

The whole family performSelector is really interesting and can be useful in a multitude of cases. Its simplest and most common application is as follows:

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

However, consider that the "timer" is not accurate. This procedure, therefore, should be used when there is required a "significant" temporal precision.

Retrieve the version of the

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

YES, true or TRUE?

e TRUE sono in pratica la stessa edentica cosa: Going to comb through the Kernel Apple iPhone you can realize that YES , true , and TRUE are basically the same thing Edentia:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/ / Definition of YES
# Define YES (BOOL) 1
# Define NO (BOOL) 0

/ / Definition of true
# Define true 1
# Define false 0

/ / Definition of TRUE
# If! Defined (TRUE)
# Define TRUE 1
# Endif

# If! Defined (FALSE)
# Define FALSE 0
# Endif

At least for now ...

Vibration

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

CGImageRef pointer from a UIImage

1
2
3
4
[ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage * heart = [UIImage imageNamed: @ "LittleHeart.png"];
heart CGImage ] ; CGImageRef image = [CGImage heart];
/ / The image can now be "rasterized" on a CGContextRef
CGRect ) { 0 , 0 , 100 , 100 } , image ) ; CGContextDrawImage (c, (CGRect) {0, 0, 100, 100}, image);

Animations

1
2
3
4
5
nil context : NULL ] ; [UIView beginAnimations: nil context: NULL];
1.5 ] ; [UIView setAnimationDuration: 1.5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
/ / ...
; [UIView commitAnimations];

NSLog

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

RGB converter UIColor

1
# Define RGBA (r, g, b, a) [UIColor colorWithRed: r/255.0 green: blue g/255.0: b/255.0 alpha: a]

Passing parameters to a NSTimer

Taking advantage of the parameter userInfo you can send a pointer to an object to our method invoked by timer.

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 target: self selector: @ selector (timerMethod) userInfo: objectPointer repeats: YES];

/ / ...

void ) timerMethod : ( NSTimer * ) timer { - (Void) timerMethod: ( NSTimer *) timer {
/ / Retrieve the pointer to my object
timer userInfo ] ; objectPointer = [timer userInfo];
/ / Or
myMethod ] ; [[Timer userInfo] myMethod];
[ [ timer userInfo ] myProperty ] ; int a = [[timer userInfo] myProperty];
/ / Which is the same
[ objectPointer myProperty ] ; int a = [objectPointer myProperty];
}

Running time

Here is a simple way to calculate a short time needed to check the speed of execution of the code:

1
2
3
4
; CFAbsoluteTime initialTime CFAbsoluteTimeGetCurrent = ();
/ / ... tails
; CFAbsoluteTime finalTime CFAbsoluteTimeGetCurrent = ();
"Tempo trascorso %f" , finalTime - initialTime ) ; NSLog (@ "elapsed time% f", finalTime - initialTime);

Continued ...

Objective-C: expose properties in a class

I would like to show and discuss some examples on how to add and manipulate properties in Objective-C class. : A classic example, precisely, is the following, in the definition of our interface class defines two properties nome and cognome :

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

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

retain ) NSString * nome; @ Property (retain) NSString * name;
retain ) NSString * cognome; @ Property (retain) NSString * name;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: In the implementation file the statement insert @synthesize so that Xcode will produce for us the methods getter and setter , respectively, used to read and set our two properties:

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

@ Implementation MyClass

@ Synthesize name, surname;

@ End

, possiamo scrive: When you're going to use our class MyClass , that is when istanziaremo an object of type MyClass , we can write:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Any other class, as AppDelegate
/ / In the file. H
# Import <UIKit/UIKit.h>
# Import "MyClass.h"

@ Class TestViewController;

NSObject <UIApplicationDelegate> { @ Interface TesAppDelegate: NSObject {<UIApplicationDelegate>
UIWindow * window;
* TestViewController viewController;

MyClass * myClass;
}

/ / In the file. M
MyClass alloc ] ; myClass = [MyClass alloc];
"Giovambattista" ; miaClasse.nome @ = "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

Or, which is equivalent to:

1
2
3
/ / Always in the file. M
@ "Undolog" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass name]);

So far so good. However, it could mislead the equivalence of the "variable" internal (ivar) with the name of the property itself. To understand the difference, propose again the same as doing without, this time, the @synthesize . . Now, therefore, we should take care to write the methods getter and setter . To further emphasize the differences, will rename the internal variables by inserting an underscore before the name. But we see the code:

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

NSObject { @ Interface MyClass: NSObject {
_nome; NSString * _Name;
_cognome; NSString * _cognome;
}

NSString * ) nome; // get - ( NSString *) name; / / get
NSString * ) cognome; // get - ( NSString *) name; / / get

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

@ End

. Unlike the previous pointers to internal variables (incapsultate) have become _nome and _cognome . . @property è scomparso, in quanto non serve più. In addition there are four definitions of methods that represent our get and set . @property has disappeared, as no longer needed.
We see the implementation file 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"

@ Implementation MyClass

/ / Get a "name"
NSString * ) nome { - ( NSString *) name {
_Name return;
}
/ / Set to "name"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Name = stringaIngresso;
}

/ / Get for "surname"
NSString * ) cognome { - ( NSString *) name {
_cognome return;
}
/ / Set for "surname"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Written as a class can be used exactly like the previous one, namely:

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

/ / Or, which is equivalent to:

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

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . At the level of educational neglect @synthesize forced us to write "their own" methods get and set , highlighting - even with the addition dell'underscore - the differences between the property name and its internal ivar _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. At the functional level the personal use of the methods get and set allows real control of the data before its setting (or prior to its reading) and then a real encapsulation to protect the internal variable.
For example it would be possible to prevent the passage of empty strings to the property nome :

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

Further variation

If you want to use the internal variables with the underscore in front (who rpoviene Adobe Actionscript could be used as well) is not necessary to abandon the use of the directive @synthesize . Xcode makes it possible to "merge" the methods mentioned above:

1
2
_nome; @ Synthesize name = _Name;
_cognome; @ Synthesize name = _cognome;

. In doing so we could use the pointer to the internally _nome , "summed up" - to the outside - as a property 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 . Moreover, it is true that the use of @synthesize produces automatic generation methods (messages) of getter and setter , it is also true that if he does not find them, so if you want to "implement" a method for your getter and / or setter you can do this even if you used the directive @synthesize .

Memory allocations

In the examples above I have omitted some important details for a real implementation. First of all, I have not shown any method init() , useful for object initialization and default values. Moreover, there is the addition of a method 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
/ / File MyClass.m
# Import "MyClass.h"

@ Implementation MyClass

id ) init { - (Id) init {
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Name @ = "Preset Name";
"Cognome preimpostato" ; _cognome @ = "Preset Name";
}
return self;
}

void ) dealloc { - (Void) dealloc {
; [_Name Release];
; [_cognome Release];
; [Super dealloc];
}

NSString * ) nome { - ( NSString *) name {
_Name return;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") @ stringaIngresso = "no name";
_Name = stringaIngresso;
}

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

@ End

, etc… In the future we will then see the details on the properties readonly , retain , etc ... :)

Continued ...

Browser or mobile browser?

Our website is now only displayed by PCs. With the spread of mobile, thanks to Apple's iPhone, to access the site or blog is increasingly being performed by a variety of mobile devices. It is therefore need to know how many Web Developer intercept and identify the different "agents", ie the means by which a user is viewing (browsing) our pages.

Continued ...

Apple iPhone: Create a custom toggle button

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! The states UIControlStateSelected or UIControlStateHighlighted not work when a UIButton mode is set UIButtonTypeCustom ! Or rather, do not work (because reserved for other types of button), for example to create a two-state button: toggle note. If we have created two images (and stato1.png stato2.png) for our button, we can proceed as follows:

1
2
3
/ / The header files that we create a global variable for usaremo
/ / Check the toggle were
ToggleFlag BOOL;

Now we create our button:

1
2
3
4
5
6
7
8
9
/ / We create a button and we place it initially in the state "stato1.png"
/ / Edit initWithFrame: (CGRect) {100,100,50,50} with the location and
/ / Size of your image has
; toggleFlag = YES;
[ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}];
@ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" Forst: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] Forst: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [ToggleButton addTarget: self action: @ selector (onToggle:) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

When you click on the button will send a message to be managed onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender {
/ / Retrieve pointer to UIButton
( UIButton * ) sender; UIButton ButtonClicked * = (UIButton *) sender;
/ / Execute Toogle
toggleFlag =! toggleFlag;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag)? @ "Stato1.png" @ "stato2.png"] Forst: UIControlStateNormal];
}

Continued ...

Very short snippet: streaming mp3 files on the Apple iPhone

An alternative very simple to run a stream a mp3 file on the Apple iPhone could be:

Continued ...

Objective-C: NSLog () of C struct

o CGPoint , ad esempio. The syntax NSLog(@"%@", ... ); works and is used to obtain information about objects, but does not work on C data types such as struct CGRect or CGPoint , for example. o NSStringFromCGPoint : To take advantage of NSLog(@"%@", ... ); even on C-style structs can rely on conversion functions like NSStringFromCGRect() or 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 (@ "Info rectangle:% @", NSStringFromCGRect (mioRect));
"Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "Info point:% @", NSStringFromCGPoint (mioPoint));

Specifically, it is possible to improve this procedure writes of small useful macros like:

1
# Define 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)

Or:

1
2
3
4
# Define NSLogCGPoint (point) NSLog (@ "% s (% 0.0f,% 0.0f)", # point.x point, Point.y)

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

That will give as output:

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

Continued ...