'Mobile' Categoria


iPad: telas de boot do punho

Em Apple iPhone e iPod foram usados ​​para gerenciar um único arquivo de imagem para carregar o aplicativo, o arquivo Default.png . Em iPad Apple, no entanto, a gestão diferente dell'orientamente requer a adoção de múltiplos arquivos de imagem, para ter certeza que você ver a tela inicial all'orientamente corrigido para o dispositivo. Durante a inicialização do aplicativo, como aconteceu com o iPhone, não é possível tirar o código para "maravilha" que o dispositivo orientado. Felizmente, ele foi introduzido no carregamento automático de arquivos especiais sobre a orientação:

Os ficheiros são suportados, para além do clássico Default.png que nunca se deve usar porque é dimensionado e deformada de acordo com a orientação, são:

  • Padrão Portrait.png-
  • Padrão PortraitUpsideDown.png-
  • Padrão Landscape.png-
  • Padrão LandscapeLeft.png-
  • Padrão LandscapeRight.png-

e LandscapeRight possono essere utilizzate per determinare orietamento e verso di quest'ultimo. As versões PortraitUpsideDown , LandscapeLeft e LandscapeRight pode ser usado para determinar orietamento e para o último.

Para o aplicativo começa, então, como recomendado pela Apple, é bom para "redesenhar" - se necessário - as nossas opiniões agindo dentro application:didFinishLaunchingWithOptions .

Leia mais ...

setAnimationDidStopSelector: diferentes usos e avançado

Na maioria dos casos, ou porque estamos acostumados ou porque vimos em tutoriais e em alguns textos, usamos o setAnimationDidStopSelector desta 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 ] ; [SetAnimationDelegate UIView: auto];
@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 definir self como delegado e através setAnimationDidStopSelector envia uma mensagem removeView quando a animação for concluída. O próprio código é correcta, no entanto, faz uso de uma definição de mensagem ( removeView ), que pode ser omitida. Agora, aqui é o mesmo código, com o mesmo efeito, sem a mensagem de 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 ] ; [SetAnimationDelegate UIView: myView];
@selector ( removeFromSuperview ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeFromSuperview)];

; myView.alpha = 0;

; [UIView commitAnimations];

! A coisa interessante sobre esta abordagem é que myView poderia ser uma subclasse de UIView ! Portanto, pode ser uma classe personalizada com as nossas próprias mensagens e, na forma definida, discretamente chamado por setAnimationDidStopSelector . Além disso, os setAnimationDidStopSelector seletores de acordo 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 ] ; [SetAnimationDelegate UIView: 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 nós definir um delegado, atro não é um ponteiro para uma instância de qualquer objeto.

Leia mais ...

Como localizar as imagens e pontos de vista em Interface Builder

Depois de explicar como localizar as nossas cordas no Xcode , como vemos agora é simples - aplicando a mesma técnica - para localizar e visualizar as imagens / interfaces criadas com o Interface Builder.

Localize recursos gráficos

O processo, como mencionado, é o mesmo, se temos uma imagem já está incluído em nossos recursos, ou inserir um novo, e nós queremos "localizar" - isto é, gerenciamento de duas ou mais imagens com base nos idiomas suportados - basta clicar no botão Imagem à direita ( Adium.png neste exemplo) e selecione Get Info:

Nós clique em Criar Localizable arquivo 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, uma das raras vezes quando isso acontece nell'alberatura Xcode é refletida no sistema de arquivos) em pastas virtuais English.lproj e Italian.lproj exatamente como aconteceu 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 dentro de Interface Builder, onde poderemos ver - por padrão - a versão em Inglês.
Neste ponto, simplesmente substituir um (ou ambos os arquivos Adium.png ) para se obter uma localização das imagens "flash".

Localize o XIB arquivos

Mesmo as interfaces construídas com Interface Builder pode ser localizado em 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 as capacidades gráficas: adicionar um ViewController (por exemplo infoViewController ) interface XIB, nós selecioná-lo, escolha Obter Informações no menu contextual, dar o localizável arquivo, adicionar localização em italiano:

ViewController

Clique em Inglês ou Italiano irá abrir o Interface Builder! ) all'interno della classica cartella Classes . Desta vez, o sistema de arquivos, vamos notar que você criou dois diretórios ( English.lproj e Italian.lproj ) dentro da pasta Classes clássica. Ambos terão seus arquivos infoViewController.xib . O conforto no presente, claramente resolvida no código, quando vamos instanciar nosso código controlador teremos 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á qualquer vestígio de qualquer declaração relativa à localização, totalmente gerenciado pelo sistema. As duas interfaces, é claro, pode ser completamente diferente no que eles estão em todos os aspectos como dois XIB ficheiros separados.

Leia mais ...

Muito curto trecho: obter a saída de um URL em Objective-C

Talvez eu devesse escrever "Muito, muito, pequenos trechos", no entanto, é um excelente e conveniente "truque" que eu vou mostrar. Executando os "dois" linhas de código abaixo, você pode obter a saída de qualquer URL e manipulá-lo.

Leia mais ...

10 trecho de útil para o iPhone da Apple

Executar um método após n segundos

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

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

No entanto, consideram que o "timer" não é preciso. Este procedimento, portanto, deve ser usado quando não é necessário precisão do tempo "considerável".

Recuperar a versão do

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

Sim, é verdade ou verdadeiro?

e TRUE sono in pratica la stessa edentica cosa: Vai passar um pente fino o iPhone da Apple Kernel você pode perceber que YES , true e TRUE são praticamente a mesma coisa edentica:

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

/ / Definição de verdade
# Define 1 true
# Define 0 false

/ / Definição de TRUE
# Se! Definida (TRUE)
# Define um VERDADEIRO
# Endif

# Se! Definida (FALSE)
# Define 0 false
# Endif

Pelo menos por agora ...

Vibração

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

Ponteiro CGImageRef a partir de um UIImage

1
2
3
4
[ UIImage imageNamed : @ "LittleHeart.png" ] ; UIImage * coração = [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 (@ "objeto NSString% @", myString);
"Float: %f " , myFloat ) ; NSLog (@ "float:% f", myFloat);
"Integer: %i " , myInt ) ; NSLog (@ "Integer:% s", 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 alfa: a]

Passando parâmetros para um NSTimer

Explorando o parâmetro userInfo você pode enviar um ponteiro para nosso objeto para o método invocado pelo temporizador.

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

/ / ...

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

Tempo de duração

Aqui está uma maneira simples de calcular o tempo curto necessário para verificar a velocidade de execução de código:

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

Leia mais ...

Objective-C: expor as propriedades em uma classe

Eu gostaria de mostrar e discutir alguns exemplos sobre como adicionar e manipular as propriedades em Objective-C classe. : Um exemplo clássico, precisamente, é a seguinte: na definição da nossa classe de interface que 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 (reter) NSString * nome;
retain ) NSString * cognome; @ Property (reter) NSString * nome;
@ End

e setter usati rispettivamente per leggere ed impostare le nostre due proprietà: No arquivo de implementação, nós inserimos a declaração @synthesize de modo que Xcode irá produzir para nós a métodos getter e setter , respectivamente, usados ​​para ler e definir nossas duas propriedades:

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

@ Implementação MyClass

@ Name sintetizar, sobrenome;

@ End

, possiamo scrive: Quando você estiver indo para usar a nossa classe MyClass , que é 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>
# Importar "MyClass.h"

@ Classe TestViewController;

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

MyClass * myClass;
}

/ / No arquivo. M
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" ] ; [SetNome myClass: @ "Undolog"];
"miaClasse.nome = %@" , [ miaClasse nome ] ) ; NSLog (@ "miaClasse.nome =% @" [myClass nome]);

So far so good. No entanto, ele poderia enganar a equivalência de "variabli" interno (ivar) como propriedade real. Para compreender a diferença, propor novamente o mesmo que fazer sem, desta vez, a @synthesize . . Agora, portanto, devemos tratar-nos a escrever a métodos getter e setter . Para enfatizar ainda mais as diferenças, as variáveis ​​internas rinominerò inserir um sublinhado antes do nome. Mas nós vemos 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; / / pega
NSString * ) cognome; // get - ( NSString *) nome; / / pega

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

@ End

. Ao contrário do exemplo anterior, os apontadores para as 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 o nosso get e set . @property desapareceu, como não precisava mais.
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
# Importar "MyClass.h"

@ Implementação MyClass

/ / Pega um "nome"
NSString * ) nome { - ( NSString *) nome {
_name Retorno;
}
/ / Definido como "nome"
void ) setNome : ( NSString * ) stringaIngresso { - (Void) setNome: ( NSString *) {stringaIngresso
_name = StringaIngresso;
}

/ / Pega para "sobrenome"
NSString * ) cognome { - ( NSString *) nome {
_cognome retornar;
}
/ / Definido como "Last Name"
void ) setCognome : ( NSString * ) stringaIngresso { - (Void) setCognome: ( NSString *) {stringaIngresso
_cognome = stringaIngresso;
}

@ End

Uma classe de modo escrita pode ser utilizado exactamente como o 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, o que é equivalente a:

@ "Undolog" ] ; [SetNome myClass: @ "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 . No nível de negligência educacional @synthesize nos obrigou a escrever "os seus próprios métodos de get e set , com destaque - mesmo com a adição dell'underscore - as diferenças entre o nome da propriedade e sua ivar interna _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 nível funcional do uso pessoal dos métodos de get e set permite o controle real dos dados antes da sua definição (ou antes de sua leitura) e, em seguida, um encapsulamento real para proteger a variável interna.
Por exemplo, seria possível impedir a passagem de cadeias vazias para a propriedade de nome :

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

Outra variante

Se você quiser usar as variáveis ​​internas com o sublinhado na frente (que rpoviene Adobe ActionScript pode ser usado como bem) não é necessário abandonar o uso da diretiva @synthesize . Xcode torna possível "mesclar" os métodos acima:

1
2
_nome; Sintetizar @ name = _name;
_cognome; Sintetizar @ name = _cognome;

. Ao fazê-lo nós poderíamos usar internamente ponteiro _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, embora o uso de @synthesize produz métodos de geração (mensagens) de getter e setter , também é verdade que ele faz isso somente se ele encontra-los, por isso, se você quer "implementar" um método para o seu getter e / ou setter pode fazer isso mesmo se você usou a directiva @synthesize .

As alocações de memória

Nos exemplos acima eu ter omitido alguns detalhes importantes para uma implementação real. Primeiro de tudo, eu ainda não mostrei 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
# Importar "MyClass.h"

@ Implementação MyClass

id ) init { - (Id) {INIT
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 Lançamento];
; [_cognome Lançamento];
; [Super dealloc];
}

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

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

@ End

, etc… No futuro, vamos então ver os detalhes sobre as propriedades readonly , retain , etc ... :)

Leia mais ...

Browser ou navegador do celular?

O nosso site não é mais visto apenas a partir de terminais de computador. Com a disseminação da telefonia móvel, graças ao iPhone, da Apple, o acesso ao site ou blog está cada vez mais sendo realizada por uma variedade de dispositivos móveis. Torne-se um Web Developer para muitos necessitam de ser capaz de interceptar e identificar os diferentes "agentes", ou seja, os meios pelos quais um usuário está vendo (navegação) nossas páginas.

Leia mais ...

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

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

1
2
3
/ / O arquivo de cabeçalho que nós criamos uma variável global para usaremo
/ / Mude o cheque foi
ToggleFlag BOOL;

Agora vamos criar o nosso botão:

1
2
3
4
5
6
7
8
9
/ / Criamos um botão e nós colocá-lo inicialmente no estado "stato1.png"
/ / Edit initWithFrame: (CGRect)} {100,100,50,50 com a posição e
/ / Tamanho da sua imagem tem
; 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 ] ; [AddTarget ToggleButton: acção de auto: @ selector (onToggle :) forControlEvents: UIControlEventTouchUpInside];
toggleButton ] ; [Self.view addSubview: ToggleButton];

Quando você clicar no botão irá enviar uma mensagem para ser gerido onToggle :

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

Leia mais ...

Muito curto trecho: streaming de arquivos de mp3 para o iPhone da Apple

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

Leia mais ...

Objective-C: NSLog () de 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 no estilo C structs que possamos nos apoiar 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 (@ "retângulo Info:% @", NSStringFromCGRect (mioRect));
"Info point: %@" , NSStringFromCGPoint ( mioPoint ) ) ; NSLog (@ "ponto Info:% @", NSStringFromCGPoint (mioPoint));

Especificamente, é possível refinar os procedimentos correspondentes pequenas macros úteis como:

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)

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)

Leia mais ...



Pare SOPA