<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Direto e Fácil &#187; Tutorial</title>
	<atom:link href="http://www.diretoefacil.com.br/tag/tutorial/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.diretoefacil.com.br</link>
	<description>Não tem que ser difícil.</description>
	<lastBuildDate>Tue, 20 Dec 2011 15:54:21 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.4</generator>
		<item>
		<title>iPhone: Áudios à vontade</title>
		<link>http://www.diretoefacil.com.br/2011/04/21/iphone-audios-a-vontade/</link>
		<comments>http://www.diretoefacil.com.br/2011/04/21/iphone-audios-a-vontade/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 04:43:53 +0000</pubDate>
		<dc:creator>Bruno Milare</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[Audio]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Música]]></category>
		<category><![CDATA[Sons]]></category>

		<guid isPermaLink="false">http://www.diretoefacil.com.br/?p=244</guid>
		<description><![CDATA[Fazendo uma pesquisa rápida de como tocar sons em uma aplicação de iPhone encontrei um tutorial muito simples que funcionou &#8216;quase&#8217; como eu gostaria. A biblioteca utilizada nesse tutorial foi a AVAudioPlayer, e me pareceu bastante simples executar um único (&#8230;)</p><p><a href="http://www.diretoefacil.com.br/2011/04/21/iphone-audios-a-vontade/">Read the rest of this entry &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Fazendo uma pesquisa  rápida de como tocar sons em uma aplicação de iPhone encontrei um <a href="http://mobileorchard.com/easy-audio-playback-with-avaudioplayer/">tutorial</a> muito simples que funcionou &#8216;quase&#8217; como eu gostaria. </p>
<p>A biblioteca utilizada nesse tutorial foi a AVAudioPlayer, e me pareceu bastante simples executar um único som, o problema é que eu gostaria de algo mais abrangente e dinâmico, eu queria um player de audio que executasse qualquer som com apenas um método, que gerenciasse meus arquivos de som, e não carregasse eles novamente, caso já tivessem sido tocados. Com essa ideia na cabeça eu criei a classe AudioPlayer.</p>
<p>Com um objeto dessa classe instaciado ele atuará como o nome já diz, como um player de áudio, você pode escolher o som que vai tocar, ele verifica se o arquivo já foi tocado anteriormente, se já, só reproduz, se não coloca ele na lista, enfim, gerencia os audios de sua aplicação.</p>
<h2>Criando o AudioPlayer</h2>
<p>Antes de mais nada é preciso adicionar o AVFoundation framework em sua aplicação, no XCode4 faça:</p>
<blockquote><p>
1. Na árvore de arquivos clique no seu projeto.<br />
2. Na barra superior da janela central clique em <em>Build Phases</em>.<br />
3. Expanda o item <em>Link Binary With Libraries</em>.<br />
4. Clique no sinal de &#8216;+&#8217; e procure por <em>AVFoundation.framework</em><br />
5. Adicione o framework ao seu projeto.
</p></blockquote>
<p>Como é uma classe bastante simples, vou colocar os códigos diretamente aqui.</p>
<p>Crie os arquivos AudioPlayer.h e AudioPlayer.m e coloque os respectivos códigos abaixo:</p>
<p><strong>AudioPlayer.h</strong></p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#import &lt;Foundation/Foundation.h&gt;</span><br />
<span style="color: #6e371a;">#import &lt;AVFoundation/AVAudioPlayer.h&gt;</span><br />
<br />
<span style="color: #a61390;">@class</span> AVAudioPlayer;<br />
<br />
<span style="color: #a61390;">@interface</span> AudioPlayer <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #400080;">NSMutableDictionary</span> <span style="color: #002200;">*</span>audioSlots;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain, nonatomic<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSMutableDictionary</span><span style="color: #002200;">*</span> audioSlots;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> playFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> filename ofType<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> type nTimes<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> times;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stopPlayingFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> filename;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stopPlayingFilesLike<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> name;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> isPlayingFile<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> filename;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> muteAll;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> clearStoredAudios;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> init;<br />
<br />
<span style="color: #a61390;">@end</span></div></div>
<p><strong>AudioPlayer.m</strong></p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#import &quot;AudioPlayer.h&quot;</span><br />
<span style="color: #a61390;">@implementation</span> AudioPlayer<br />
<span style="color: #a61390;">@synthesize</span> audioSlots;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span> init<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; audioSlots <span style="color: #002200;">=</span> &nbsp;<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableDictionary</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">return</span> self;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> playFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> filename ofType<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> type nTimes<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span> times<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; AVAudioPlayer <span style="color: #002200;">*</span>currentSlot <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>audioSlots objectForKey<span style="color: #002200;">:</span>filename<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>currentSlot <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>filePath <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> pathForResource<span style="color: #002200;">:</span> filename ofType<span style="color: #002200;">:</span> type<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>fileURL <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> alloc<span style="color: #002200;">&#93;</span> initFileURLWithPath<span style="color: #002200;">:</span>filePath<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; currentSlot <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>AVAudioPlayer alloc<span style="color: #002200;">&#93;</span> initWithContentsOfURL<span style="color: #002200;">:</span>fileURL error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>audioSlots setObject<span style="color: #002200;">:</span>currentSlot forKey<span style="color: #002200;">:</span>filename<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>currentSlot prepareToPlay<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>fileURL release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>currentSlot release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; currentSlot.numberOfLoops <span style="color: #002200;">=</span> times;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>currentSlot play<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stopPlayingFile<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> filename<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; AVAudioPlayer <span style="color: #002200;">*</span>currentSlot <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>audioSlots objectForKey<span style="color: #002200;">:</span>filename<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>currentSlot <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span>currentSlot stop<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span> isPlayingFile<span style="color: #002200;">:</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> filename<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; AVAudioPlayer <span style="color: #002200;">*</span>currentSlot <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>audioSlots objectForKey<span style="color: #002200;">:</span>filename<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>currentSlot <span style="color: #002200;">!=</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">return</span> currentSlot.playing;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">return</span> <span style="color: #a61390;">NO</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> stopPlayingFilesLike<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> name<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #a61390;">NSRange</span> textRange;<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>slotKey <span style="color: #a61390;">in</span> <span style="color: #002200;">&#91;</span>audioSlots allKeys<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; textRange <span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>slotKey lowercaseString<span style="color: #002200;">&#93;</span> rangeOfString<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>name lowercaseString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>textRange.location <span style="color: #002200;">!=</span> NSNotFound<span style="color: #002200;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>audioSlots objectForKey<span style="color: #002200;">:</span>slotKey<span style="color: #002200;">&#93;</span> stop<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#125;</span><br />
&nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> muteAll<br />
<span style="color: #002200;">&#123;</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; <span style="color: #a61390;">for</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>slotKey <span style="color: #a61390;">in</span> <span style="color: #002200;">&#91;</span>audioSlots allKeys<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>audioSlots objectForKey<span style="color: #002200;">:</span>slotKey<span style="color: #002200;">&#93;</span> stop<span style="color: #002200;">&#93;</span>;<br />
&nbsp; <span style="color: #002200;">&#125;</span><br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> clearStoredAudios<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self muteAll<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>audioSlots removeAllObjects<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> dealloc<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self muteAll<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>audioSlots release<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<span style="color: #a61390;">@end</span></div></div>
<h2>Utilizando o AudioPlayer</h2>
<p>Isso é fácil, basta instanciar um objeto da classe AudioPlayer:</p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">audioPlayer <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>AudioPlayer alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;</div></div>
<p>Os nomes dos métodos são bastante intuitivos, o que vale explicar é que o AudioPlayer utiliza o nome do arquivo como chave do dicionário de AVAudioPlayers, eu pensei nessa abordagem porque fica muito mais fácil você gerencia-los assim.</p>
<p>Por exemplo, eu tenho 3 arquivos tocando: MusicBack.mp3, SoundClick.wav e o SoundFoo.mp3, se eu crio uma regra de negócio onde existe a diferença entre som e música, eu posso facilmente parar todos os sons chamando o método:</p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">audioPlayer.stopPlayingFilesLike<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Sound&quot;</span>;</div></div>
<p>Você pode tocar o arquivo de som que você quiser, só basta chamar:</p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">audioPlayer.playFile<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;SoundBar&quot;</span> ofType<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;mp3&quot;</span> nTimes<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span></div></div>
<p>Lembrando que se você colocar o parâmetro <em>nTimes</em> = -1, o som ficará tocando em loop.</p>
<h2>Exemplo</h2>
<p><a href="http://www.flickr.com/photos/59650699@N08/5642565226/" title="AudioPlayerDemo by brunomilare, on Flickr"><img src="http://farm6.static.flickr.com/5270/5642565226_24875b45be.jpg" width="266" height="500" alt="AudioPlayerDemo"></a></p>
<p>O exemplo da foto acima pode ser encontrado no meu <a href="http://github.com/milare/AudioPlayerDemo">github</a>.</p>
<p>[]s</p>
<p>Bruno.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diretoefacil.com.br/2011/04/21/iphone-audios-a-vontade/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iPhone: Splash Screen</title>
		<link>http://www.diretoefacil.com.br/2011/04/19/iphone-splash-screen/</link>
		<comments>http://www.diretoefacil.com.br/2011/04/19/iphone-splash-screen/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 23:33:33 +0000</pubDate>
		<dc:creator>Bruno Milare</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[Objective-C]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[dev]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[Splash Screen]]></category>

		<guid isPermaLink="false">http://www.diretoefacil.com.br/?p=236</guid>
		<description><![CDATA[Seguindo o meu aprendizado orientado a demanda, me deparei com o problema de ter que criar uma splash screen para uma aplicação que carregava muito rapidamente. Splash screen ? Oras, isso deve ser fácil, vou dar uma pesquisada e logo (&#8230;)</p><p><a href="http://www.diretoefacil.com.br/2011/04/19/iphone-splash-screen/">Read the rest of this entry &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Seguindo o meu aprendizado orientado a demanda, me deparei com o problema de ter que criar uma splash screen para uma aplicação que carregava muito rapidamente.</p>
<p>Splash screen ? Oras, isso deve ser fácil, vou dar uma pesquisada e logo arrumo uma solução razoável.</p>
<p>Pois é, eu estava errado, não no ponto de ser fácil, porque é, mas na questão de achar rapidamente uma solução, ainda mais para XCode 4. Existem diversas maneiras de se fazer isso, só que sinceramente, existem umas que além de não funcionarem, desrespeitam qualquer boa prática.</p>
<p>Um exemplo disso que eu vi, foi o cara colocar a imagem Default.png, que é a imagem que a aplicação exibe quando o aplicativo está carregando, e colocar ele para dormir pelo tempo que ele julgue necessário a imagem ficar aparecendo. Eu acredito que essa não seja a maneira correta, porque você está perdendo uma liberdade utilizando a imagem Default.png para isso, além do que deixar a aplicação dormindo não é uma boa ideia por definição. =P</p>
<p>Deixando de lado essas abordagens, e qualquer comentário, sobre a necessidade ou não de uma splash screen, vamos a solução utilizada.</p>
<p><span id="more-236"></span></p>
<h2>Implementação</h2>
<p>Já um pouco familiarizado com troca entre views eu pensei comigo mesmo, vou carregar a aplicação, e quando terminar eu chamo a view de splash deixo ela lá um tempo e depois faço o dismiss. óbvio.</p>
<p>Depois de criar um (UIViewController) SplashScreenViewController, sem absolutamente nada, deixei meu controller principal da seguinte maneira:</p>
<p><strong>DemoSplashViewController.h:</strong></p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span><br />
<span style="color: #6e371a;">#import &quot;SplashScreenViewController.h&quot;</span><br />
<br />
<span style="color: #6e371a;">#define SPLASH_HIDE_DELAY &nbsp; &nbsp;1.0f</span><br />
<br />
<span style="color: #a61390;">@interface</span> DemoSplashScreenViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #11740a; font-style: italic;">// Splash Screen</span><br />
&nbsp; &nbsp; SplashScreenViewController <span style="color: #002200;">*</span>splashViewController;<br />
<span style="color: #002200;">&#125;</span><br />
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>retain, nonatomic<span style="color: #002200;">&#41;</span> SplashScreenViewController <span style="color: #002200;">*</span>splashViewController;<br />
<br />
<span style="color: #11740a; font-style: italic;">/**<br />
&nbsp;* Splash Screen<br />
&nbsp;**/</span><br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>showSplash;<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>hideSplash;<br />
<br />
<span style="color: #a61390;">@end</span></div></div>
<p><strong>DemoSplashScreenViewController.m:</strong></p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #a61390;">@synthesize</span> splashViewController;<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>showSplash<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; self.splashViewController <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>SplashScreenViewController alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self presentModalViewController<span style="color: #002200;">:</span> splashViewController animated<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;<br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span>self performSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>hideSplash<span style="color: #002200;">&#41;</span> withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> afterDelay<span style="color: #002200;">:</span> SPLASH_HIDE_DELAY<span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span><br />
<br />
<br />
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>hideSplash<br />
<span style="color: #002200;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self splashViewController<span style="color: #002200;">&#93;</span> dismissModalViewControllerAnimated<span style="color: #002200;">:</span> <span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;<br />
<span style="color: #002200;">&#125;</span></div></div>
<p>Assim bastou eu chamar no <strong>DemoSplashScreenAppDelegate.m</strong> dentro do método didFinishLaunchingWithOptions:</p>
<div class="codecolorer-container objc vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="objc codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#40;</span>DemoSplashScreenViewController<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> self.window.rootViewController showSplash<span style="color: #002200;">&#93;</span>;</div></div>
<p>O método showSplash chama o hideSplash após o tempo determinado na constante SPLASH_HIDE_DELAY.<br />
Para customizar sua splash screen basta alterar a view SplashScreenViewController.xib</p>
<p>E Voilá&#8230;</p>
<p>O código fonte pode ser encontrado em:  <a href="http://github.com/milare/DemoSplashScreen">github.com/milare/DemoSplashScreen</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.diretoefacil.com.br/2011/04/19/iphone-splash-screen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Search + params + will_paginate</title>
		<link>http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/</link>
		<comments>http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 18:12:12 +0000</pubDate>
		<dc:creator>Márcio Gasparotto</dc:creator>
				<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[will_paginate]]></category>

		<guid isPermaLink="false">http://www.diretoefacil.com.br/?p=18</guid>
		<description><![CDATA[Depois que iniciei meu curso de ruby on rails na e-genial ministrado pelo Carlos Brando, tenho me dedicado ainda mais em conhecer e me aprofundar em rails, começar a fazer projetos realmente legais com a ferramenta e deixar de ser (&#8230;)</p><p><a href="http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/">Read the rest of this entry &#187;</a></p>]]></description>
			<content:encoded><![CDATA[<p>Depois que iniciei meu curso de ruby on rails na e-genial ministrado pelo <a href="http://www.nomedojogo.com/" target="_blank">Carlos Brando</a>, tenho me dedicado ainda mais em conhecer e me aprofundar em rails, começar a fazer projetos realmente legais com a ferramenta e deixar de ser apenas mais um eterno iniciante ou um programador mediocre&#8230;.</p>
<p>Esses dias estava trabalhando em um projeto pessoal, em rails é claro&#8230;rs, e precisei implantar uma busca no meu sistema, algo trivial, mas ai fui incrementar, paginar os resultados no estilo dig, etc&#8230; Nesse ponto tive alguns problemas com as rotas e na passagem de parâmetros, ai resolvi fazer esse mini tutorial de como resolvi o problema.</p>
<p>Se alguem conhecer uma solução melhor comenta ai.</p>
<p>Bem, vamos lá&#8230; Para paginar registros eu já estava usando o <a title="Will Paginate" href="http://github.com/mislav/will_paginate/tree/master" target="_blank">will_paginate</a>, e minha solução ficou da seguinte maneira:</p>
<p>No meu controller (categorias_controller.rb) eu adicionei o seguinte metodo:</p>
<p><script src="http://gist.github.com/19916.js"></script></p>
<p>Como estava implantando o formulário de busca em uma tela já pronta e iria repetir esse form em vários lugares, criei um partial para o formulário da busca (_busca.html.erb).</p>
<p><script src="http://gist.github.com/19917.js"></script></p>
<p>A view (busca.html.erb) que apresenta os resultados ficou da seguinte maneira:</p>
<p><script src="http://gist.github.com/19919.js"></script></p>
<p>Observem a linha 26, quando chamo o will_paginate preciso passar como parâmetro a variável query que contem a expressão que esta sendo buscada:</p>
<p><script src="http://gist.github.com/19922.js"></script></p>
<p>No meu arquivo routes.rb eu adicionei uma collection no resouce categorias.</p>
<p><script src="http://gist.github.com/19923.js"></script></p>
<p>Veja que adicionei a :busca como sendo mais um resource de :categorias, o parametro :any significa que esse resource responderá  :get/:post/:put/:delete, eu poderia simplesmente colocar :get, uma vez que o parâmetro nesse caso só é passado via url, mas deixei como :any pra exemplificar.</p>
<p>Ou coisa, pra não precisar ficar definindo os labels do will_paginate em todo os lugares, acrescentei no final(depois do ultimo end) do meu arquivo environment.rb as seguintes linhas:</p>
<p><script src="http://gist.github.com/19924.js"></script></p>
<p>Ai foi só reiniciar o server e partir pro abraço!</p>
<p>Abraço a todos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.diretoefacil.com.br/2008/10/26/search-params-will_paginate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.961 seconds -->

