Categoria 'Mobile'
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 ...
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 ...
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:

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 ...
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 ...
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 ...
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 :
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 ...
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 ...
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 ...
Uma alternativa muito fácil de executar um fluxo de um arquivo mp3 no iPhone da Apple pode ser:
Continuação ...
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 ...
Últimos comentários
Giovambattista Fazioli : @ Ale: Como mostrado @ Kevin ver em GitHub repo: https://github.com/gfazioli/Ch roma-Key
Giovambattista Fazioli : @ Kevin: Veja https://github.com/gfazioli/Ch roma-Key
Kevin : Very nice exemplo -, gostaria de ver o fla também.!
Ludovica : Olá! Vou explicar a minha dúvida. Quando eu escrevo um post não adicionar imagens no artigo (se assim for ...
Marco : Olá @ Giovan Battista Fazioli, obrigado por todas as explicações sobre este excelente guia. Eu tenho uma pergunta para ...