Categoria 'Mobile'


iPad: gerenciar suas telas de inicialização

Na Apple iPhone e iPod que usamos para gerenciar um único arquivo de imagem quando o aplicativo é carregado, o arquivo Default.png . Na Apple iPad, no entanto, a outra gestão dell'orientamente exige a adoção de vários arquivos de imagem, para se certificar de que você vê a tela inicial all'orientamente correto para o dispositivo. Quando o aplicativo é iniciado, como foi o caso do iPhone, não é possível falar código para "maravilha" neste orientação do dispositivo. Felizmente ele foi introduzido no carregamento automático de arquivos especiais, dependendo da orientação:

Os arquivos são suportados atualmente, além do clássico Default.png não recomendamos que você use como é redimensionada e deformado com base na orientação são:

  • 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. O versões PortraitUpsideDown , LandscapeLeft e LandscapeRight pode ser usado para determinar Retrato Ver e para o último.

Para aplicação começou, então, como recomendado pela Apple, é bom para "redesenhar" - quando necessário - nossos pontos de vista atuando em application:didFinishLaunchingWithOptions .

Continuação ...

setAnimationDidStopSelector: usos diferentes e avançadas

Na maioria dos casos, ou porque estamos acostumados, ou porque vimos em tutoriais e em alguns textos, usamos o setAnimationDidStopSelector da seguinte maneira:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nil context : NULL ] ; [UIView beginAnimations: contexto nulo: 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. No código acima, o setAnimationDelegate define self como um delegado e através setAnimationDidStopSelector envia-lhe uma mensagem removeView quando a animação for concluída. O código é em si correcta, no entanto, faz uso de uma definição de mensagem ( removeView ) que poderiam ser omitidas. Agora, aqui está o mesmo código, com o mesmo efeito, sem a mensagem removeView :

1
2
3
4
5
6
7
8
9
nil context : NULL ] ; [UIView beginAnimations: contexto nulo: 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];

! A coisa interessante sobre essa abordagem é que myView poderia ser uma subclasse de uma UIView ! Portanto, pode ser uma classe personalizada com as nossas próprias mensagens e, como explicado, em silêncio pode ser chamado de setAnimationDidStopSelector . Além disso, o setAnimationDidStopSelector aceita selectores com parâmetros:

1
2
3
4
5
6
7
8
9
nil context : NULL ] ; [UIView beginAnimations: contexto nulo: 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];

Este exemplo pode ser estendido para todos os casos aqui onde montamos um delegado, Grim não é um ponteiro para uma instância de qualquer objeto.

Continuação ...

Como localizar imagens e visões de Interface Builder

Depois de descrever como localizar nossas cordas no Xcode , vamos ver agora o quanto é simples - aplicando a mesma técnica - localizar imagens e visões / interfaces criadas com o Interface Builder.

Localize recursos gráficos

O processo, como mencionado, é o mesmo, se temos uma imagem já inserida em nossos recursos, ou podemos inserir um novo, e queremos que a "localizar" - que é gerenciar duas ou mais imagens com base nos idiomas suportados - basta clicar no botão imagem da direita ( Adium.png neste exemplo) e selecione Get Info:

Criar arquivo clique localizável no canto inferior esquerdo.

Clique em Adicionar e insira Localização Italian :

A fim de obter:

esattamente come accadeva con il testo: Nossa imagem é movido (fisicamente, um dos raros momentos em que acontecem nell'alberatura Xcode é refletido no sistema de arquivos) em pastas virtuais English.lproj e Italian.lproj como foi o caso com o texto:

contiene una stessa versione dell'immagine. Neste ponto, cada uma das pastas English.lproj e Italian.lproj contém a mesma versão da imagem. Esta imagem é manipulada em Interface Builder, onde vamos ver - por padrão - a versão em Inglês.
Neste ponto, apenas substituir um (ou ambos arquivos Adium.png ) para conseguir a localização das imagens "Flash".

Localize o arquivo XIB

Mesmo as interfaces construídas com interface Builder podem ser localizadas na sua totalidade, quando for considerado necessário. ) con interfaccia XIB , lo selezioniamo, scegliamo Get Info dal menu contestuale, rendiamo il file localizzabile, aggiungiamo la localizzazione in italiano: O procedimento é idêntico ao realizado com os recursos gráficos: adicionar um ViewController (eg infoViewController ) Interface XIB, vamos selecioná-la, escolha Obter Informações no menu contextual, fazemos os arquivos localizáveis, adicionar localização em italiano:

ViewController

Clicando Inglese ou Inglês abrirá o Interface Builder! ) all'interno della classica cartella Classes . Desta vez, o sistema de arquivos, você vai notar que você tenha criado duas pastas ( English.lproj e Italian.lproj ) na pasta Classes clássico. Ambos terão o seu arquivo infoViewController.xib . O conforto neste, resolveu evidente no código, e quando vamos instanciar nosso código controlador, você terá uma "limpa" como este:

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

Como você pode ver, não há registro de qualquer declaração relativa à localização, totalmente gerenciado pelo sistema. As duas interfaces, é claro, podem ser completamente diferentes, como eles são para todos os efeitos que os dois ficheiros XIB separada.

Continuação ...

Muito curto trecho: obter o resultado de uma URL em Objective-C

Talvez eu devesse ter escrito: "Muito, muito, curto trecho", no entanto, é um excelente e conveniente "truque" que eu estou prestes a mostrar. Ao executar as "duas" linhas de código abaixo, você pode obter a saída de qualquer URL e manipulá-lo.

Continuação ...

10 trechos úteis para Apple iPhone

Executar um método depois de n segundos

Toda a família performSelector é muito interessante e pode ser útil num grande número de casos. A sua aplicação mais simples e mais comum é a seguinte:

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

No entanto, considera que o "temporizador" não é preciso. Este processo, portanto, deve ser usado quando não é solicitado para uma precisão "significativa" temporal.

Recuperar a versão do aplicativo

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

SIM, verdadeiro ou falso?

e TRUE sono in pratica la stessa edentica cosa: Indo para vasculhar o iPhone da Apple Kernel você pode perceber que YES , true e TRUE edentica são basicamente a mesma coisa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/ / Definição da YES
# Define SIM (BOOL) 1
# Define NO (BOOL) 0

/ / Definição da verdadeira
# Defina true 1
# Define false 0

/ / Definição de TRUE
# Se! Definido (TRUE)
# Define VERDADEIRO 1
# Endif

# Se! Definido (FALSO)
# Define FALSE 0
# Endif

Pelo menos por enquanto ...

Tagarelice

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

CGImageRef ponteiro de um UIImage

1
2
3
4
[ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage * heart = [UIImage imageNamed: @ "LittleHeart.png"];
heart CGImage ] ; CGImageRef imagem = [coração CGImage];
/ / A imagem pode agora ser "varridas" em um CGContextRef
CGRect ) { 0 , 0 , 100 , 100 } , image ) ; CGContextDrawImage (c, (CGRect) {0, 0 100, 100}, imagem);

Animações

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

NSLog

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

Conversor de RGB para UIColor

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

Passar parâmetros em um NSTimer

Aproveitando o parâmetro userInfo você pode enviar um ponteiro para o nosso objeto para o método invocado pelo 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: repete objectPointer: YES];

/ / ...

void ) timerMethod : ( NSTimer * ) timer { - (Void) timerMethod: ( NSTimer *) temporizador {
/ / Recuperar o ponteiro para o meu objeto
timer userInfo ] ; objectPointer = [temporizador userInfo];
/ / Ou
myMethod ] ; [[Temporizador userInfo] myMethod];
[ [ timer userInfo ] myProperty ] ; int a = [[temporizador userInfo] myProperty];
/ / Que é o mesmo
[ objectPointer myProperty ] ; int a = [objectPointer myProperty];
}

O tempo de execução

Aqui está uma forma simples de calcular o curto período de tempo necessário para verificar a velocidade de execução do código:

1
2
3
4
; CFAbsoluteTime initialTime CFAbsoluteTimeGetCurrent = ();
/ / ... código
; CFAbsoluteTime finalTime CFAbsoluteTimeGetCurrent = ();
"Tempo trascorso %f" , finalTime - initialTime ) ; NSLog (@ "Tempo decorrido% f", finalTime - initialTime);

Continuação ...

Objective-C: expõem propriedades em uma classe

Eu gostaria de mostrar e discutir alguns exemplos sobre como adicionar e manipular uma propriedade na classe Objective-C. : Um exemplo clássico, precisamente, é o seguinte, na definição de nossa interface de classe, definimos duas propriedades nome e cognome :

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

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

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

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: No arquivo de implementação que inserir declaração @synthesize de forma que Xcode produzir para nós os métodos getter e setter utilizados para obter e definir as nossas duas propriedades:

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

@ Implementação MyClass

@ Name sintetizar sobrenome;

@ End

, possiamo scrive: Quando você estiver indo para usar a nossa classe MyClass , ou seja, quando istanziaremo um objeto do tipo MyClass , podemos escrever:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/ / Qualquer outra classe, como AppDelegate
/ / No arquivo. H
# Importar <UIKit/UIKit.h>
# Import "MyClass.h"

@ Classe TestViewController;

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

MyClass * myClass;
}

/ / No arquivo. Meters
MyClass alloc ] ; myClass = [myClass alloc];
"Giovambattista" ; miaClasse.nome = @ "Giovambattista";
"miaClasse.nome = %@" , miaClasse.nome ) ; NSLog (@ "miaClasse.nome =% @", miaClasse.nome);

Ou, o que é equivalente a:

1
2
3
/ / Sempre no arquivo. M
@ "Undolog" ] ; [MyClass setNome: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @", [myClass nome]);

So far so good. No entanto, ele pode enganar a equivalência de "variabli" interna (Ivar), com o nome do próprio imóvel. Para entender a diferença, propor novamente o mesmo que fazer sem, desta vez, o @synthesize . . Agora, portanto, devemos levar-nos para escrever os métodos getter e setter . Para sublinhar ainda mais as diferenças, rinominerò as variáveis ​​internas, inserindo um sublinhado na frente do nome. Mas vamos ver o código:

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

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

NSString * ) nome; // get - ( NSString *) nome; / / obtém
NSString * ) cognome; // get - ( NSString *) nome; / / obtém

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

@ End

. Ao contrário dos ponteiros anteriores para variáveis ​​internas (incapsultate) tornaram-se _nome e _cognome . . @property è scomparso, in quanto non serve più. Além disso, existem quatro definições de métodos que representam a nossa get e set . @property desapareceu, como não é mais necessário.
Vemos o arquivo de implementação 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"

@ Implementação MyClass

/ / Obter um "nome"
NSString * ) nome { - ( NSString *) {name
_NAME Retorno;
}
/ / Definir a "nome"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_Name = StringaIngresso;
}

/ / Pega de "sobrenome"
NSString * ) cognome { - ( NSString *) {name
_cognome retornar;
}
/ / Set de "sobrenome"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Uma classe de modo escrito pode ser usado exactamente como a anterior, a saber:

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);

/ / Ou, que é equivalente a:

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

e set , evidenziando – anche con l'aggiunta dell'underscore – le differenze tra il nome della proprietà e la sua ivar interna _nome . Ao nível da negligência educacional @synthesize nos obrigou a escrever métodos "a si mesmo" get e set , com destaque - mesmo com a adição dell'underscore - a diferença entre o nome da propriedade e do seu interior 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. A um nível funcional do uso de métodos pessoais get e set permite um controlo efectivo dos dados antes da sua fixação (ou antes da leitura) e, em seguida, uma verdadeira encapsulamento para proteger a variável interna.
Por exemplo, seria possível evitar a passagem de cadeias vazias para a propriedade nome :

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

Além disso variante

Se você deseja usar as variáveis ​​internas com o sublinhado na frente (que rpoviene do Adobe ActionScript pode ser usado também) não precisa abandonar o uso da diretiva @synthesize . Xcode torna possível para "fundir" os métodos descritos acima:

1
2
_nome; Sintetizar @ name = _Name;
_cognome; @ Sintetizar sobrenome = _cognome;

. Ao fazer isso, poderíamos usar o ponteiro para internamente _nome ", resumiu" - para o exterior - como uma propriedade de 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 . Além disso, se é verdade que o uso de @synthesize produz os métodos de geração automática (mensagens) de getter e setter , também é verdade que ele faz isso só se encontra, por isso, se você quiser "implementar" um método para o seu getter e / ou setter pode fazê-lo mesmo se você usou uma directiva @synthesize .

Alocações de memória

Nos exemplos acima omiti alguns detalhes importantes para uma implementação real. Primeiro de tudo, eu não apresentaram qualquer método init() , útil para a inicialização do objeto e valores padrão. Além disso, falta-lhe a adição de um método 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
/ / Arquivo MyClass.m
# Import "MyClass.h"

@ Implementação MyClass

id ) init { - (Id) de inicialização {
self = [ super init ] ) { if (self = [super init]) {
"Nome preimpostato" ; _Name = @ "Nome da predefinição";
"Cognome preimpostato" ; _cognome = @ "nome da predefinição";
}
retornar auto;
}

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

NSString * ) nome { - ( NSString *) {name
_NAME Retorno;
}
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
stringaIngresso == @ "" ) stringaIngresso = @ "senza nome" ; if (@ stringaIngresso == "") stringaIngresso = @ "sem nome";
_Name = StringaIngresso;
}

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

@ End

, etc… No futuro, vamos ver os detalhes sobre a propriedade readonly , retain , etc ... :)

Continuação ...

Browser ou navegador da web móvel?

Nosso site agora não é apenas exibido pelo PC. Com a propagação do celular, graças principalmente à Apple iPhone, o acesso ao site ou blog está cada vez mais sendo feitas a partir de dispositivos móveis de vários tipos. Por isso, é preciso saber quantos interceptação Desenvolvedor Web e identificar os diferentes "agentes", isto é, o meio pelo qual a vista do usuário (vela) nossas páginas.

Continuação ...

Apple iPhone: criar um botão de alternância personalizado

non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Os estados UIControlStateSelected ou UIControlStateHighlighted não funcionar quando um UIButton está definido no modo UIButtonTypeCustom ! Ou melhor, não funcionam como deveriam (porque reservados para outros tipos de botão), por exemplo, para criar um botão com dois estados: nota de alternância. Se criamos duas imagens (stato1.png e stato2.png) para o nosso botão, podemos proceder da seguinte maneira:

1
2
3
/ / O arquivo de cabeçalho, criamos uma variável global que usaremo para
/ / Verifique a alternância foram
ToggleFlag BOOL;

Agora vamos criar o nosso botão:

1
2
3
4
5
6
7
8
9
/ / Creaiamo um botão e colocá-lo em primeiro lugar na "stato1.png"
/ / Editar initWithFrame: (CGRect) {} 100,100,50,50 com a localização e
/ / Tamanho de sua imagem especular
; 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: @ "" forState: UIControlStateNormal];
[ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: UIControlStateNormal];
self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [ToggleButton addTarget: self ação: @ selector (onToggle :) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

Quando você clica no botão será enviada uma mensagem tratada pelo onToggle :

1
2
3
4
5
6
7
void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender {
/ / Recuperar ponteiro para UIButton
( UIButton * ) sender; ButtonClicked UIButton * = (UIButton *) remetente;
/ / Eu corro toogle
toggleFlag = toggleFlag!;
[ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [? ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png": @ "stato2.png"] forState: UIControlStateNormal];
}

Continuação ...

Muito curto trecho: streaming de arquivos mp3 no Apple iPhone

Uma alternativa muito fácil de executar um fluxo de um arquivo mp3 no iPhone da Apple pode ser:

Continuação ...

Objective-C: NSLog () em C struct

o CGPoint , ad esempio. A sintaxe NSLog(@"%@", ... ); funciona e é usado para obter informações sobre objetos, mas não funciona em tipos de dados C, como struct CGRect ou CGPoint , por exemplo. o NSStringFromCGPoint : Para aproveitar NSLog(@"%@", ... ); também em estruturas de estilo C pode se apoiar em funções de conversão como 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 (@ "Info retângulo:% @", NSStringFromCGRect (mioRect));
"Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "ponto Info:% @", NSStringFromCGPoint (mioPoint));

Especificamente, você pode refinar esse procedimento scrivendosi de pequenas macros que são úteis como:

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

Ou:

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

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

Isso vai dar como saída:

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

Continuação ...