Boas festas e Feliz 2010
sábado, dezembro 26th, 2009À todos que acompanham este blog, quero desejar boas festas e um próspero 2010.
Que todos os nossos sonhos se concretizem!
À todos que acompanham este blog, quero desejar boas festas e um próspero 2010.
Que todos os nossos sonhos se concretizem!
Se você desejar ter mais informações sobre o Subversion, você pode ler o arquivo README.txt
cat Linear/README.txt
Até agora criamos e configuramos o Subversion, agora é necessário configurar o Xcode, para que ele possa entender que vamos usar um repositório de dados. Inicie o Xcode e selecione File / Open. Quando a tela de diálogo aparecer digite “~”. Desta forma irá abrir uma janela que permitirá a você digitar o caminho de um diretório, que no caso será o caminho do nosso repositório, portanto digite:
~ / .subversion
Agora você está vendo uma lista de arquivos deste diretório escondido, selecione config e pressione return. Você vai precisar modificar algumas linhas neste arquivo de configuração, para facilitar seu trabalho utilize o Find. Localize global-ignores. Apague o caracter “#” e inclua esta linha logo em seguida:
build *.nib *.so *.pbxuser *.mode* *.perspective*
Está acabando, agora vá até o fim deste arquivo e inclua as seguintes linhas:
*.mode = svn:mime-type=text/X-xcode
*.mode = svn:mime-type=text/X-xcode
*.pbxuser = svn:mime-type=text/X-xcode
*.perspective* = svn:mime-type=text/X-xcode
*.pbxproj = svn:mime-type=text/X-xcode
Pronto, terminamos com este arquivo. Salve o arquivo e pode fecha-lo.
Agora vamos informar o repositório para o Xcode. No menu do Xcode, selecione SCM / Configure SCM Repositories e você terá a seguinte figura: (figura 04)
No campo Name digite Linear File Repository e na URL digite:file:///Users/Shared/Subversion/Linear. Agora sim está tudo pronto para usar. Agora para você adicionar um projeto no controle de versão, feche esta tela e selecione SCM / Repositories e agora você terá esta tela: (figura 05).
Selecione o ícone Import, selecione a pasta do projeto e pronto, já montou um controle de versão para o seu projeto.
Nesta segunda parte vamos nos concentrar somente nos conceitos mais importantes pois muita coisa já foi vista em edições anteriores. No método viewDidLoad, iniciamos as configurações do acelerômetro, observem a inicialização da variável accel. Já no método accelerometer controlamos o uso com aquela variável booleana que declaramos no .h. Se não utilizassemos esta variável o acelerômetro sairia funcionando de imediato e não é isso que desejamos. Todos os demais métodos já foram apresentados anteriormente, o que vemos agora são variações sobre o tema. Observem que os métodos next e previous tem o mesmo conceito, eles servirão para navegar entre os wallpapers, no método play temos alguns comandos novos, como exibir um alerta no momento que o usuário selecionar um wallpaper para o iPhone:
UIImageWriteToSavedPhotosAlbum(myImage, nil, nil, nil);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Wallpaper SAVED” message:@”Close Playper and open the Settings app to set your wallpaper” delegate:nil cancelButtonTitle:@”OK” otherButtonTitles:nil];
Na primeira linha temos o comando que irá gravar a imagem no álbum de fotos e na segunda temos o alerta informando ao usuário que a imagem foi efetivamente gravada. Outro ponto que merece observação é o momento que o usuário seleciona um wallpaper, vamos analisar o método showPicture01 (do 1 até o 9 todos tem o mesmo conceito),
- (IBAction)showPicture01 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 1;
imgPicture.image = [UIImage imageNamed:@"2-nitro.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
Neste método estamos deixando todos os botões de seleção escondidos, para que eles não atrapalhem o funcionamento da segunda tela. Depois estamos configurando o indice para 1, pois é o primeiro wallpaper que o usuário selecionou (lembrem existem 9), depois definimos qual é a imagem do wallpaper número 1, colocamos esta informação na variável que criamos para se tornar dinâmica, a imgPicture, após isso apresentamos a view de zoom. Observem que todos métodos showPicture, tem o mesmo comportamento, mudando apenas o indice e a imagem que será exibida pela view de zoom.
Bom, por hoje é isso, mas antes de finalizar gostaria de lembrar que até o momento, o SDK do iPhone não permite modificar o wallpaper programaticamente, por esta razão estamos copiando o wallpaper para o álbum de fotos e depois o usuário terá que coloca-lo como wallpaper.
Depois das declarações IBOutlet temos uma variável booleana que irá controlar o uso do acelerômetro, no momento certo falaremos dela. Após isso temos as declarações de todas as propriedades dos elementos que iremos utilizar e chegamos finalmente nas ações que a nossa aplicação irá executar. No primeiro bloco, botões de exibição, temos as ações que irão apresentar os wallpapers que o usuários selecionar, o conceito é bem simples, cada botão executa a sua respectiva ação. Esta ação irá exibir a view de zoom. No bloco seguinte, interno, temos a ação que fecha a exibição do wallpaper que o usuário selecionou, ainda temos as ações que navegam pela escolha do usuário, como next, previous e ainda a ação que irá inserir nosso wallpaper no álbum de fotos, a play.
Com isto fechamos uma breve explicação da primeira parte do código, vamos para a segunda.
Implementando o código
Vamos agora para a segunda parte do nosso código, no arquivo MainViewController.m vamos inserir o seguinte código:
#import “MainViewController.h”
#import “MainView.h”
static int showIndex = 1;
@implementation MainViewController
@synthesize vewMain, vewZoom, imgPicture, btnImage01, btnImage02, btnImage03, btnImage04, btnImage05, btnImage06, btnImage07, btnImage08, btnImage09, btnInfo;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
// Custom initialization
}
return self;
}
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
UIAccelerometer *accel = [UIAccelerometer sharedAccelerometer];
accel.delegate = self;
accel.updateInterval = kUpdateInterval;
[super viewDidLoad];
}
- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
int numberRandom = 0;
if (! brokenScreenShowing) {
if (fabsf(acceleration.x) > kAccelerationThreshold || fabsf(acceleration.y) > kAccelerationThreshold || fabsf(acceleration.z) > kAccelerationThreshold) {
while (numberRandom != showIndex && numberRandom == 0) {
numberRandom = round(random()%8) + 1;
}
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = numberRandom;
switch (showIndex) {
case 1:
imgPicture.image = [UIImage imageNamed:@"2-nitro.jpg"];
break;
case 2:
imgPicture.image = [UIImage imageNamed:@"2-juniao.jpg"];
break;
case 3:
imgPicture.image = [UIImage imageNamed:@"2-tom.jpg"];
break;
case 4:
imgPicture.image = [UIImage imageNamed:@"2-fido.jpg"];
break;
case 5:
imgPicture.image = [UIImage imageNamed:@"2-sassi.jpg"];
break;
case 6:
imgPicture.image = [UIImage imageNamed:@"2-hiro.jpg"];
break;
case 7:
imgPicture.image = [UIImage imageNamed:@"2-cellus.jpg"];
break;
case 8:
imgPicture.image = [UIImage imageNamed:@"2-fargas.jpg"];
break;
case 9:
imgPicture.image = [UIImage imageNamed:@"2-bueno.jpg"];
break;
default:
break;
}
[self.vewMain insertSubview:vewZoom atIndex:2];
}
}
}
- (void)flipsideViewControllerDidFinish:(FlipsideViewController *)controller {
[self dismissModalViewControllerAnimated:YES];
}
- (IBAction)showInfo {
FlipsideViewController *controller = [[FlipsideViewController alloc] initWithNibName:@”FlipsideView” bundle:nil];
controller.delegate = self;
controller.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentModalViewController:controller animated:YES];
[controller release];
}
- (IBAction)hideZoom {
btnInfo.hidden = FALSE;
btnImage01.hidden = FALSE;
btnImage02.hidden = FALSE;
btnImage03.hidden = FALSE;
btnImage04.hidden = FALSE;
btnImage05.hidden = FALSE;
btnImage06.hidden = FALSE;
btnImage07.hidden = FALSE;
btnImage08.hidden = FALSE;
btnImage09.hidden = FALSE;
[vewZoom removeFromSuperview];
}
- (IBAction)showNext {
showIndex++;
if (showIndex == 10) {
showIndex = 1;
}
switch (showIndex) {
case 1:
imgPicture.image = [UIImage imageNamed:@"2-nitro.jpg"];
break;
case 2:
imgPicture.image = [UIImage imageNamed:@"2-juniao.jpg"];
break;
case 3:
imgPicture.image = [UIImage imageNamed:@"2-tom.jpg"];
break;
case 4:
imgPicture.image = [UIImage imageNamed:@"2-fido.jpg"];
break;
case 5:
imgPicture.image = [UIImage imageNamed:@"2-sassi.jpg"];
break;
case 6:
imgPicture.image = [UIImage imageNamed:@"2-hiro.jpg"];
break;
case 7:
imgPicture.image = [UIImage imageNamed:@"2-cellus.jpg"];
break;
case 8:
imgPicture.image = [UIImage imageNamed:@"2-fargas.jpg"];
break;
case 9:
imgPicture.image = [UIImage imageNamed:@"2-bueno.jpg"];
break;
default:
break;
}
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPrevious {
showIndex–;
if (showIndex == 0) {
showIndex = 9;
}
switch (showIndex) {
case 1:
imgPicture.image = [UIImage imageNamed:@"2-nitro.jpg"];
break;
case 2:
imgPicture.image = [UIImage imageNamed:@"2-juniao.jpg"];
break;
case 3:
imgPicture.image = [UIImage imageNamed:@"2-tom.jpg"];
break;
case 4:
imgPicture.image = [UIImage imageNamed:@"2-fido.jpg"];
break;
case 5:
imgPicture.image = [UIImage imageNamed:@"2-sassi.jpg"];
break;
case 6:
imgPicture.image = [UIImage imageNamed:@"2-hiro.jpg"];
break;
case 7:
imgPicture.image = [UIImage imageNamed:@"2-cellus.jpg"];
break;
case 8:
imgPicture.image = [UIImage imageNamed:@"2-fargas.jpg"];
break;
case 9:
imgPicture.image = [UIImage imageNamed:@"2-bueno.jpg"];
break;
default:
break;
}
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPlay {
UIImage *myImage;
switch (showIndex) {
case 1:
myImage = [UIImage imageNamed:@"mark.jpg"];
break;
case 2:
myImage = [UIImage imageNamed:@"juniao.jpg"];
break;
case 3:
myImage = [UIImage imageNamed:@"capaCauboiFecha.jpg"];
break;
case 4:
myImage = [UIImage imageNamed:@"fido.jpg"];
break;
case 5:
myImage = [UIImage imageNamed:@"elisa.jpg"];
break;
case 6:
myImage = [UIImage imageNamed:@"hiro_montanha.jpg"];
break;
case 7:
myImage = [UIImage imageNamed:@"cellus.jpg"];
break;
case 8:
myImage = [UIImage imageNamed:@"fargas.jpg"];
break;
case 9:
myImage = [UIImage imageNamed:@"bueno.jpg"];
break;
default:
break;
}
UIImageWriteToSavedPhotosAlbum(myImage, nil, nil, nil);
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@”Wallpaper SAVED” message:@”Close Playper and open the Settings app to set your wallpaper” delegate:nil cancelButtonTitle:@”OK” otherButtonTitles:nil];
[alert show];
[alert release];
btnInfo.hidden = FALSE;
btnImage01.hidden = FALSE;
btnImage02.hidden = FALSE;
btnImage03.hidden = FALSE;
btnImage04.hidden = FALSE;
btnImage05.hidden = FALSE;
btnImage06.hidden = FALSE;
btnImage07.hidden = FALSE;
btnImage08.hidden = FALSE;
btnImage09.hidden = FALSE;
[vewZoom removeFromSuperview];
}
- (IBAction)showPicture01 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 1;
imgPicture.image = [UIImage imageNamed:@"2-nitro.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture02 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 2;
imgPicture.image = [UIImage imageNamed:@"2-juniao.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture03 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 3;
imgPicture.image = [UIImage imageNamed:@"2-tom.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture04 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 4;
imgPicture.image = [UIImage imageNamed:@"2-fido.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture05 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 5;
imgPicture.image = [UIImage imageNamed:@"2-sassi.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture06 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 6;
imgPicture.image = [UIImage imageNamed:@"2-hiro.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture07 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 7;
imgPicture.image = [UIImage imageNamed:@"2-cellus.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture08 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 8;
imgPicture.image = [UIImage imageNamed:@"2-fargas.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (IBAction)showPicture09 {
btnInfo.hidden = TRUE;
btnImage01.hidden = TRUE;
btnImage02.hidden = TRUE;
btnImage03.hidden = TRUE;
btnImage04.hidden = TRUE;
btnImage05.hidden = TRUE;
btnImage06.hidden = TRUE;
btnImage07.hidden = TRUE;
btnImage08.hidden = TRUE;
btnImage09.hidden = TRUE;
showIndex = 9;
imgPicture.image = [UIImage imageNamed:@"2-bueno.jpg"];
[self.vewMain insertSubview:vewZoom atIndex:2];
}
- (void)didReceiveMemoryWarning {
// Releases the view if it doesn’t have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren’t in use.
}
- (void)viewDidUnload {
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)dealloc {
[super dealloc];
}
@end
Na última edição tivemos uma breve explicação de como funciona o acelerômetro. Hoje vamos programar o restante das funcionalidades da nossa aplicação. Vamos rever alguns conceitos já apresentados e vamos codificar o nosso acelerômetro conforme a necessidade do nosso projeto. Mas vamos ao que interessa, vamos ao projeto. Para os menos avisados nosso projeto se encontra no repositóro da MAC+.
Iniciando a codificação
Abra o nosso projeto, e no arquivo MainViewController.h vamos inserir o seguinte código:
#import “FlipsideViewController.h”
#define kAccelerationThreshold 1.2
#define kUpdateInterval (1.0f/10.0f)
@interface MainViewController : UIViewController <FlipsideViewControllerDelegate, UIAccelerometerDelegate> {
IBOutlet UIView *vewMain, *vewZoom;
IBOutlet UIImageView *imgPicture;
IBOutlet UIButton *btnImage01, *btnImage02, *btnImage03, *btnImage04, *btnImage05, *btnImage06, *btnImage07, *btnImage08, *btnImage09, *btnInfo;
BOOL brokenScreenShowing;
}
@property (nonatomic, retain) UIView *vewMain, *vewZoom;
@property (nonatomic, retain) UIButton *btnImage01, *btnImage02, *btnImage03, *btnImage04, *btnImage05, *btnImage06, *btnImage07, *btnImage08, *btnImage09, *btnInfo;
@property (nonatomic, retain) UIImageView *imgPicture;
// botões exibição
- (IBAction)showInfo;
- (IBAction)showPicture01;
- (IBAction)showPicture02;
- (IBAction)showPicture03;
- (IBAction)showPicture04;
- (IBAction)showPicture05;
- (IBAction)showPicture06;
- (IBAction)showPicture07;
- (IBAction)showPicture08;
- (IBAction)showPicture09;
// interno
- (IBAction)hideZoom;
- (IBAction)showNext;
- (IBAction)showPrevious;
- (IBAction)showPlay;
@end
Vamos rever alguns conceitos, os defines declarados no inicio do código determinam a tolerância e o intervalo que a aplicação vai executar o acelerômetro, kAccelerationThreshold e kUpdateInterval respectivamente. Na declaração da interface informamos as delegações, que no caso serão o FlipSideViewControllerDelegate e o UIAccelerometerDelegate. Sem estas delegações nosso código não irá compilar, pois no momento que encontrar referências a estes códigos, ele não terá a delegação adequada. Depois temos as declarações do tipo IBOutlet. Como já dissemos em edições anterios, estas declarações se referem aos elementos que serão declarados no Interface Builder e fazem parte da nossa interface gráfica. No caso, estamos declarando duas views, a primeira será a nossa view principal a segunda conterá o wallpaper selecionado pelo usuário no momento que a aplicação estiver funcionando. Outro elemento gráfico que será utilizado na interface é o UIImageView. Como teremos apenas uma tela para apresentar o wallpaper escolhido pelo usuário, vamos fazer com que a imagem que estiver na tela de zoom seja dinâmica, por esta razão vamos manipula-la separadamente. Os outros elementos gráficos são os botões que iremos usar para que usuário possa escolher o seu wallpaper preferido. Teremos 9 wallpapers, logo são 9 botões. Temos ainda um botão para informações.