<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6429545539076699458</id><updated>2011-07-31T03:30:19.444+03:00</updated><category term='UIImage'/><category term='Cocos2d'/><category term='iPhoneDevCamp'/><category term='iPhone tips and tricks'/><category term='Xcode'/><category term='Mac OS'/><category term='Quartz 2d'/><title type='text'>iCoder's Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>14</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-495136729564244160</id><published>2009-09-09T10:13:00.007+03:00</published><updated>2009-09-15T18:17:58.332+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhoneDevCamp'/><title type='text'>Небольшой фотоотчет с iPhoneDevCamp (Киев, 5 сентября, GlClub)</title><content type='html'>&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.com/s/c/bin/slideshow.swf" width="600" height="400" flashvars="host=picasaweb.google.com&amp;captions=1&amp;hl=en_US&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.com%2Fdata%2Ffeed%2Fapi%2Fuser%2FMaxScheglov%2Falbumid%2F5379347234213236529%3Falt%3Drss%26kind%3Dphoto%26hl%3Den_US" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;Отчет о проходившем миникемпе здесь &lt;a href="http://iphonedevcamp.com.ua/2009/09/iphonedevcamp-kyiv-v10/"&gt;iphonedevcamp.com.ua&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-495136729564244160?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/495136729564244160/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/09/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/495136729564244160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/495136729564244160'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/09/blog-post.html' title='Небольшой фотоотчет с iPhoneDevCamp (Киев, 5 сентября, GlClub)'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-2468145014806121491</id><published>2009-08-25T16:14:00.003+03:00</published><updated>2009-08-25T16:17:41.584+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone tips and tricks'/><title type='text'>Выключаем автоматический переход в спящий режим</title><content type='html'>Для того, чтобы отключить автоматичекий переход устройства в спящий режим - в applicationDidFinishLaunching отключаем таймер, который за это отвечает:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;application.idleTimerDisabled = YES;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-2468145014806121491?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/2468145014806121491/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/2468145014806121491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/2468145014806121491'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/blog-post.html' title='Выключаем автоматический переход в спящий режим'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-4112222694389187751</id><published>2009-08-24T01:08:00.011+03:00</published><updated>2009-08-24T01:48:55.473+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><title type='text'>Запуск приложений без регистрации iPhone developer'ом</title><content type='html'>В этом посте описывается технология, позволяющая запукать и отлаживать приложения, написанные на официальном sdk, при отсутствии регистрации в iPhone developer program($99). &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Для этого нам потребуется iPhone/iPod touch (jailbreaked) и официальный sdk. Все описанное ниже я делал на iPod touch с прошивкой 2.1 и официальный sdk 2.2.19m2621a final. Для прошивки 3.0 и sdk 3-ей версии данный способ не заработал ( замечу, что к этому времени у меня появилась регистрация в iPhone developer program, поэтому стал отлаживать приложения стандартными методами ).  &lt;br /&gt;Далее описана вся процедура по шагам:&lt;br /&gt;1. Создать сертификат "iPhone Pwned Developer", изпользуя Keychain Access. Пошаговая инструкция - &lt;a href="http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Procedures/Procedures.html#//apple_ref/doc/uid/TP40005929-CH4-SW1"&gt;link&lt;/a&gt;&lt;br /&gt;2. В текущем проекте необходимо задать следующие опции (Project settings):&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JOC-D5fbBe8/SpHCL1916AI/AAAAAAAAACA/tVfSLcz1DFk/s1600-h/42703-xcodepsetting.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 136px;" src="http://4.bp.blogspot.com/_JOC-D5fbBe8/SpHCL1916AI/AAAAAAAAACA/tVfSLcz1DFk/s320/42703-xcodepsetting.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5373289339150526466" /&gt;&lt;/a&gt;&lt;br /&gt;3. В Info.plist добавляем следующие строки:&lt;br /&gt;&amp;#60;key&amp;#62;SignerIdentity&amp;#60;/key&amp;#62;&lt;br /&gt;&amp;#60;string&amp;#62;Apple iPhone OS Application Signing&amp;#60;/string&amp;#62;&lt;br /&gt;Также следует отметить, что при подключении устройства будет предложено использовать его для разработки приложений - подтверждаем это. Также для созданного сертификата необходимо в опциях ( вызываются по двойному клику на сертификате) для пункта trust указать Always trust. Ошибки вида &lt;br /&gt;&lt;pre class="brush: shell"&gt;&lt;br /&gt;CodeSign error: no provisioning profiles found for code signing identity 'iPhone Pwned Developer'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;решались перезагрузкой Xcode.&lt;br /&gt;&lt;br /&gt;Вот собственно и все. Build &amp; Go. :)&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-4112222694389187751?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/4112222694389187751/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/iphone-developer.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/4112222694389187751'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/4112222694389187751'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/iphone-developer.html' title='Запуск приложений без регистрации iPhone developer&apos;ом'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JOC-D5fbBe8/SpHCL1916AI/AAAAAAAAACA/tVfSLcz1DFk/s72-c/42703-xcodepsetting.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-4052339808784680846</id><published>2009-08-24T00:22:00.004+03:00</published><updated>2009-08-24T01:39:56.399+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><title type='text'>Uninstall Xcode</title><content type='html'>Для того, чтобы удалить Xcode, достаточно выполнить в терминале:&lt;br /&gt;&lt;pre class="brush: shell"&gt;sudo /Developer/Library/uninstall-devtools --mode=all&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-4052339808784680846?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/4052339808784680846/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/uninstall-xcode.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/4052339808784680846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/4052339808784680846'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/uninstall-xcode.html' title='Uninstall Xcode'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-855472665626809092</id><published>2009-08-19T15:24:00.010+03:00</published><updated>2009-08-24T01:40:38.110+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone tips and tricks'/><title type='text'>Запуск приложений из своей программы под iPhone</title><content type='html'>Иногда может понадобиться запустить сторонне приложение из своей программы под iPhone. Например, открыть браузер с указанным URL или дать возможность пользователю перейти в AppStore, чтобы купить платную версию программы. &lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Вот некоторые приложения, которые вы можете запустить из своей программы:&lt;br /&gt;&lt;br /&gt;    * Google Maps&lt;br /&gt;    * Apple Mail&lt;br /&gt;    * Dial a Phone Number&lt;br /&gt;    * SMS Application&lt;br /&gt;    * Browser&lt;br /&gt;    * AppStore&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Browser&lt;/span&gt;&lt;br /&gt;Простой пример для запуска Safari с указанным URL:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;NSURL *url = [NSURL URLWithString:@"http://www.iphonedevelopertips.com"];&lt;br /&gt;[[UIApplication sharedApplication] openURL:url];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Данную технологию можно использовать также и для других приложений, описанных ниже.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Google Maps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;URL для запуска Google Maps должна иметь следующий вид:&lt;br /&gt;&lt;br /&gt;http://maps.google.com/maps?q=${QUERY_STRING}&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;// Создаем запрос&lt;br /&gt;NSString* searchQuery = @"1 Infinite Loop, Cupertino, CA 95014";&lt;br /&gt;// Кодируем строку&lt;br /&gt;searchQuery =  [searchQuery stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];&lt;br /&gt;// Создаем строку с URL&lt;br /&gt;NSString* urlString = [NSString stringWithFormat:@"http://maps.google.com/maps?q=%@", searchQuery];&lt;br /&gt;// вызываем openURL&lt;br /&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Apple Mail&lt;/span&gt;&lt;br /&gt;Иногда может быть очень полезным дать пользователю возможность быстро отправить e-mail, запустив почтовый клиент с уже введенным адресом. Для этого формат URI должен соответствовать следующему шаблону:&lt;br /&gt;&lt;br /&gt;mailto://${EMAIL_ADDRESS}&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"mailto:email@email.com?subject=Hello"]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Звонок на телефонный номер&lt;/span&gt;&lt;br /&gt;Также openURL можно использовать для осуществления звонков на тел. номера. Особенность: после того, как пользователь нажмет кнопку “End Call”, он вернется обратно в нашу программу.&lt;br /&gt;&lt;br /&gt;tel://${PHONE_NUMBER}&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://8004664411"]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SMS Application&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Дает возможность пользователю быстро отправить sms.&lt;br /&gt;&lt;br /&gt;sms:${PHONENUMBER_OR_SHORTCODE}&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"sms:55555"]];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;AppStore&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;В своих программах можно использовать запуск AppStore для покупки пользователем платной версии программы. URL при этом имеет вид:&lt;br /&gt;&lt;br /&gt;http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=291586600&amp;mt=8&lt;br /&gt;&lt;br /&gt;Например:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;NSURL *appStoreUrl = [NSURL URLWithString:@"http://phobos.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=291586600&amp;amp;mt=8"];&lt;br /&gt;[[UIApplication sharedApplication] openURL:appStoreUrl];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-855472665626809092?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/855472665626809092/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/iphone_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/855472665626809092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/855472665626809092'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/iphone_19.html' title='Запуск приложений из своей программы под iPhone'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-2170611835889085423</id><published>2009-08-18T11:20:00.005+03:00</published><updated>2009-08-19T16:02:40.908+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone tips and tricks'/><title type='text'>Переименовываем Xcode - проект или исполняемый файл</title><content type='html'>Иногда возникает необходимость в переименовании проекта в Xcode. Например, когда новый проект создан путем добавления небольших( или очень больших:) )изменений в уже существующий проект. Далее описано, как это сделать.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Собственно, два способа:&lt;br /&gt;&lt;br /&gt;1.  Переименовать весь проект&lt;br /&gt;2.  Переименовать только исполняемый файл&lt;br /&gt;&lt;br /&gt;Переименование проекта в Xcode 3.x&lt;br /&gt;&lt;br /&gt;1. Скопировать и переименовать папку с проектом&lt;br /&gt;2. Переименовать файлы с расширением .pch and .xcodeproj&lt;br /&gt;3. Клик правой кнопкой мыши на файле с расширением .xcodeproj -&gt; show contents. В файле с расширением .pbxproj заменить все вхождения с именем старого проекта на новое.&lt;br /&gt;4. Удалить папку build &lt;br /&gt;5. Открыть проект -&gt; Targets -&gt; Кликнуть правой кнопкой мыши на требуемой группе и выбрать Get Info.&lt;br /&gt;6. Переключиться на вкладку build и в разделе packaging изменить значение product name на новое.&lt;br /&gt;8. Build Clean all Targets.&lt;br /&gt;&lt;br /&gt;Изменение имени исполняемого файла&lt;br /&gt;&lt;br /&gt;1. Открыть проект -&gt; Targets -&gt; Кликнуть правой кнопкой мыши на требуемой группе и выбрать Get Info.&lt;br /&gt;2. Переключиться на вкладку build и в разделе packaging изменить значение product name на новое.&lt;br /&gt;3. Build Clean all Targets.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-2170611835889085423?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/2170611835889085423/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/xcode.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/2170611835889085423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/2170611835889085423'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/xcode.html' title='Переименовываем Xcode - проект или исполняемый файл'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-8271793590909314771</id><published>2009-08-17T11:37:00.011+03:00</published><updated>2009-08-20T00:33:15.227+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone tips and tricks'/><title type='text'>Скрываем status bar в приложениях iPhone</title><content type='html'>Два способа скрыть statusbar в программах под iPhone&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;1) Для того, чтобы убрать панель состояния, достаточно добавить следующую строку в applicationDidFinishLaunching: &lt;br /&gt;&lt;pre class="brush: cpp"&gt;[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;2) Добавить в Info.plist новое свойство UIStatusBarHidden, задать его тип как Boolean и установить его выбранным.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_JOC-D5fbBe8/SokX9F6y8FI/AAAAAAAAABo/qYEKBtcWpM8/s1600-h/hidestatusbar1-300x134.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 134px;" src="http://2.bp.blogspot.com/_JOC-D5fbBe8/SokX9F6y8FI/AAAAAAAAABo/qYEKBtcWpM8/s320/hidestatusbar1-300x134.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5370850368944271442" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_JOC-D5fbBe8/SokYDVguX2I/AAAAAAAAABw/7pbLse6RZ8c/s1600-h/hidestatusbar2-300x183.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 183px;" src="http://3.bp.blogspot.com/_JOC-D5fbBe8/SokYDVguX2I/AAAAAAAAABw/7pbLse6RZ8c/s320/hidestatusbar2-300x183.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5370850476209102690" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JOC-D5fbBe8/SokYHkXLb-I/AAAAAAAAAB4/Y4n8AaqZgq0/s1600-h/hidestatusbar3-300x12.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 300px; height: 12px;" src="http://1.bp.blogspot.com/_JOC-D5fbBe8/SokYHkXLb-I/AAAAAAAAAB4/Y4n8AaqZgq0/s320/hidestatusbar3-300x12.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5370850548915072994" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-8271793590909314771?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/8271793590909314771/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/hide-iphone-status-bar.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/8271793590909314771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/8271793590909314771'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/hide-iphone-status-bar.html' title='Скрываем status bar в приложениях iPhone'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JOC-D5fbBe8/SokX9F6y8FI/AAAAAAAAABo/qYEKBtcWpM8/s72-c/hidestatusbar1-300x134.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-8396128998874939144</id><published>2009-08-10T12:27:00.007+03:00</published><updated>2009-08-20T00:33:44.323+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cocos2d'/><title type='text'>Создаем часы, показывающие минуты и секунды, используя Cocos2d</title><content type='html'>Создаем объект класса LabelAtlas, который будет отвечать за вывод времени и инициализируем вызов метода tick каждую секунду. &lt;br /&gt;&lt;pre class="brush: cpp"&gt;float gameTime = 0;&lt;br /&gt;LabelAtlas *label = [[LabelAtlas alloc] initWithString:@"00:00" charMapFile:@"numbers.png" itemWidth:16 itemHeight:16 startCharMap:'.'];&lt;br /&gt;[self schedule: @selector(tick:) interval:1.0];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Описываем обработчик, который будет срабатывать каждую секунду&lt;br /&gt;&lt;pre class="brush: cpp"&gt;-(void) tick: (ccTime) dt&lt;br /&gt;{ &lt;br /&gt;  gameTime = gameTime+1;&lt;br /&gt;  &lt;br /&gt; //Get the int value for total seconds&lt;br /&gt; int seconds = [[NSNumber numberWithFloat:gameTime] intValue];&lt;br /&gt;  &lt;br /&gt; //Get the minutes&lt;br /&gt; int realMinutes = seconds / 60;&lt;br /&gt; //Get the seconds left over after you find the total minutes&lt;br /&gt; int realSeconds = seconds % 60;&lt;br /&gt;  &lt;br /&gt; // Create strings to hold the string value of minutes and seconds&lt;br /&gt; NSString *minutesString = @"%d";&lt;br /&gt; NSString *secondsString = @"%d";&lt;br /&gt;  &lt;br /&gt; //Add zeros to minutes and seconds if less than ten so time always follows 00:00 format&lt;br /&gt; if(realMinutes &lt; 10) minutesString = @"0%d";&lt;br /&gt; if(realSeconds &lt; 10) secondsString = @"0%d";&lt;br /&gt;  &lt;br /&gt; //Add the strings together for display The dot is used to grab the colon from the number.png&lt;br /&gt; //using the dot just grabs the first 16x16 section of numbers.png for display.&lt;br /&gt; NSString *timeString = [[minutesString stringByAppendingString:@"."] stringByAppendingString:secondsString];&lt;br /&gt;  &lt;br /&gt; // Add the string to the label with the calculated minutes and seconds&lt;br /&gt; [label setString:[NSString stringWithFormat:timeString, realMinutes, realSeconds]]; &lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;В проект следует добавить файл numbers.png&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_JOC-D5fbBe8/Sn_qs1aTg9I/AAAAAAAAABg/qiC1JdhsPpQ/s1600-h/numbers.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 192px; height: 16px;" src="http://4.bp.blogspot.com/_JOC-D5fbBe8/Sn_qs1aTg9I/AAAAAAAAABg/qiC1JdhsPpQ/s320/numbers.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5368267336821474258" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-8396128998874939144?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/8396128998874939144/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/cocos2d.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/8396128998874939144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/8396128998874939144'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/cocos2d.html' title='Создаем часы, показывающие минуты и секунды, используя Cocos2d'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JOC-D5fbBe8/Sn_qs1aTg9I/AAAAAAAAABg/qiC1JdhsPpQ/s72-c/numbers.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-6486722238550141411</id><published>2009-08-06T18:38:00.009+03:00</published><updated>2009-08-24T01:41:02.277+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mac OS'/><title type='text'>Добавление пробела между иконками в Dock (Dock Spacer)</title><content type='html'>Ниже описан способ создания разделителя(spacer) в доке(dock), который можно использовать для разделения программ по тематикам.&lt;br /&gt;Разделитель дока для программ&lt;br /&gt;&lt;pre class="brush: shell"&gt;defaults write com.apple.dock persistent-apps -array-add '{tile-data={}; tile-type="spacer-tile";}' &lt;br /&gt;killall Dock&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Разделитель дока для документов&lt;br /&gt;&lt;pre class="brush: shell"&gt;defaults write com.apple.dock persistent-others -array-add '{tile-data={}; tile-type="spacer-tile";}'&lt;br /&gt;killall Dock&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-6486722238550141411?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/6486722238550141411/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/spacer-dock.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/6486722238550141411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/6486722238550141411'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/spacer-dock.html' title='Добавление пробела между иконками в Dock (Dock Spacer)'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-2951333998007642715</id><published>2009-08-05T23:55:00.008+03:00</published><updated>2009-08-20T00:34:30.006+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UIImage'/><category scheme='http://www.blogger.com/atom/ns#' term='Quartz 2d'/><title type='text'>Наложить маску на UIImage</title><content type='html'>Наложение маски дает возможность динамически создавать изображения нестандартной формы. Например:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_JOC-D5fbBe8/Snny7i2TykI/AAAAAAAAABY/w6UWT7LbrzY/s1600-h/maskingstoryboard1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 100px;" src="http://1.bp.blogspot.com/_JOC-D5fbBe8/Snny7i2TykI/AAAAAAAAABY/w6UWT7LbrzY/s320/maskingstoryboard1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5366587535769455170" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Пример наложения маски на изображение, используя Quartz2d&lt;br /&gt;&lt;pre class="brush: cpp"&gt;-(CGImageRef) CopyImageAndAddAlphaChannel:(CGImageRef) sourceImage {&lt;br /&gt; CGImageRef retVal = NULL;&lt;br /&gt; &lt;br /&gt; size_t width = CGImageGetWidth(sourceImage);&lt;br /&gt; size_t height = CGImageGetHeight(sourceImage);&lt;br /&gt; &lt;br /&gt; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();&lt;br /&gt; &lt;br /&gt; CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, &lt;br /&gt;                8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);&lt;br /&gt; &lt;br /&gt; if (offscreenContext != NULL) {&lt;br /&gt;  CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);&lt;br /&gt;  &lt;br /&gt;  retVal = CGBitmapContextCreateImage(offscreenContext);&lt;br /&gt;  CGContextRelease(offscreenContext);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; CGColorSpaceRelease(colorSpace);&lt;br /&gt; &lt;br /&gt; return retVal;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)maskImage {&lt;br /&gt; CGImageRef maskRef = maskImage.CGImage;&lt;br /&gt; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),&lt;br /&gt;          CGImageGetHeight(maskRef),&lt;br /&gt;          CGImageGetBitsPerComponent(maskRef),&lt;br /&gt;          CGImageGetBitsPerPixel(maskRef),&lt;br /&gt;          CGImageGetBytesPerRow(maskRef),&lt;br /&gt;          CGImageGetDataProvider(maskRef), NULL, false);&lt;br /&gt; &lt;br /&gt; CGImageRef sourceImage = [image CGImage];&lt;br /&gt; CGImageRef imageWithAlpha = sourceImage;&lt;br /&gt; //add alpha channel for images that don't have one (ie GIF, JPEG, etc...)&lt;br /&gt; //this however has a computational cost&lt;br /&gt; if (CGImageGetAlphaInfo(sourceImage) == kCGImageAlphaNone) { &lt;br /&gt;  imageWithAlpha = [self CopyImageAndAddAlphaChannel:sourceImage];&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask);&lt;br /&gt; CGImageRelease(mask);&lt;br /&gt; &lt;br /&gt; //release imageWithAlpha if it was created by CopyImageAndAddAlphaChannel&lt;br /&gt; if (sourceImage != imageWithAlpha) {&lt;br /&gt;  CGImageRelease(imageWithAlpha);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; UIImage* retImage = [UIImage imageWithCGImage:masked];&lt;br /&gt; CGImageRelease(masked);&lt;br /&gt; &lt;br /&gt; return retImage;&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;Пример использования:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt; orgImage = [UIImage imageNamed:@"picture.png"];&lt;br /&gt; if(orgImage==nil){&lt;br /&gt;  NSLog(@"Error! Image not found!");&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt; UIImage *mask = [UIImage imageNamed:@"mask.png"];&lt;br /&gt; if(mask==nil){&lt;br /&gt;  NSLog(@"Error! Image not found!");&lt;br /&gt;  return;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; orgImage=[[self maskImage:orgImage withMask:mask] retain];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Для того, чтобы просто наложить одно изображение поверх другого:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;&lt;br /&gt;- (UIImage *)maskImage:(UIImage *)image withMask:(UIImage *)maskImage {&lt;br /&gt; CGImageRef sourceImage = [image CGImage];&lt;br /&gt; CGImageRef maskedImage = [maskImage CGImage]; &lt;br /&gt; CGImageRef retVal = NULL;&lt;br /&gt; &lt;br /&gt; size_t width = CGImageGetWidth(sourceImage);&lt;br /&gt; size_t height = CGImageGetHeight(sourceImage);&lt;br /&gt; &lt;br /&gt; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();&lt;br /&gt; &lt;br /&gt; CGContextRef offscreenContext = CGBitmapContextCreate(NULL, width, height, &lt;br /&gt;                8, 0, colorSpace, kCGImageAlphaPremultipliedFirst);&lt;br /&gt; &lt;br /&gt; if (offscreenContext != NULL) {&lt;br /&gt;  CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), sourceImage);&lt;br /&gt;  CGContextDrawImage(offscreenContext, CGRectMake(0, 0, width, height), maskedImage);&lt;br /&gt;  //CGContextSetBlendMode(offscreenContext, kCGBlendModeMultiply);&lt;br /&gt;  &lt;br /&gt;  retVal = CGBitmapContextCreateImage(offscreenContext);&lt;br /&gt;  CGContextRelease(offscreenContext);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; CGColorSpaceRelease(colorSpace);&lt;br /&gt; &lt;br /&gt; UIImage* retImage = [UIImage imageWithCGImage:retVal];&lt;br /&gt; CGImageRelease(retVal);&lt;br /&gt; &lt;br /&gt; return retImage;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-2951333998007642715?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/2951333998007642715/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/how-to-maks-uiimage.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/2951333998007642715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/2951333998007642715'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/how-to-maks-uiimage.html' title='Наложить маску на UIImage'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JOC-D5fbBe8/Snny7i2TykI/AAAAAAAAABY/w6UWT7LbrzY/s72-c/maskingstoryboard1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-470294645104258940</id><published>2009-08-03T09:26:00.004+03:00</published><updated>2009-08-03T09:46:57.921+03:00</updated><title type='text'>Решение проблемы _CFGetHostUUIDString: unable to determine UUID for host. Error: 35</title><content type='html'>Ошибка эта очень многолика. У меня возникла при попытке создать файл для локализации программы под iPhone (используя genstrings).&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Решение проблемы: &lt;br /&gt;Скачать &lt;a href="http://www.4shared.com/file/122546626/49da71ad/IONetworkingFamily.html"&gt;кекст&lt;/a&gt;. &lt;br /&gt;В терминале выполнить:&lt;br /&gt;&lt;pre class="prettyprint"&gt;$sudo -s &lt;br /&gt;cp /patch/IONetworkingFamily /System/Library/Extensions/IONetworkingFamily.kext/Contents/MacOS/IONetworkingFamily #chown 0:0 /System/Library/Extensions/IONetworkingFamily.kext/Contents/MacOS/IONetworkingFamily #rm /System/Library/Extensions.mkext  &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Удалить кэш кекстов и перезагрузиться.  &lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-470294645104258940?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/470294645104258940/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/cfgethostuuidstring-unable-to-determine.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/470294645104258940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/470294645104258940'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/cfgethostuuidstring-unable-to-determine.html' title='Решение проблемы _CFGetHostUUIDString: unable to determine UUID for host. Error: 35'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-3864956380818787264</id><published>2009-08-01T18:47:00.004+03:00</published><updated>2009-08-24T01:43:52.983+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPhone tips and tricks'/><title type='text'>Звук в приложениях под iPhone</title><content type='html'>Для проигрывания звука в приложениях под iPhone можно воспользоваться способом из программы BubbleLevel, которую можно найти &lt;a href="http://developer.apple.com/"&gt;здесь&lt;/a&gt;.&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Добавляем в проект следующие файлы:&lt;br /&gt;SoundEffect.h&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#import &lt;UIKit/UIKit.h&gt;&lt;br /&gt;#import &lt;AudioToolbox/AudioServices.h&gt;&lt;br /&gt;&lt;br /&gt;@interface SoundEffect : NSObject {&lt;br /&gt;    SystemSoundID _soundID;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;+ (id)soundEffectWithContentsOfFile:(NSString *)aPath;&lt;br /&gt;- (id)initWithContentsOfFile:(NSString *)path;&lt;br /&gt;- (void)play;&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;SoundEffect.m&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#import "SoundEffect.h"&lt;br /&gt;&lt;br /&gt;@implementation SoundEffect&lt;br /&gt;+ (id)soundEffectWithContentsOfFile:(NSString *)aPath {&lt;br /&gt;    if (aPath) {&lt;br /&gt;        return [[[SoundEffect alloc] initWithContentsOfFile:aPath] autorelease];&lt;br /&gt;    }&lt;br /&gt;    return nil;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (id)initWithContentsOfFile:(NSString *)path {&lt;br /&gt;    self = [super init];&lt;br /&gt;    &lt;br /&gt;    if (self != nil) {&lt;br /&gt;        NSURL *aFileURL = [NSURL fileURLWithPath:path isDirectory:NO];&lt;br /&gt;        &lt;br /&gt;        if (aFileURL != nil)  {&lt;br /&gt;            SystemSoundID aSoundID;&lt;br /&gt;            OSStatus error = AudioServicesCreateSystemSoundID((CFURLRef)aFileURL, &amp;aSoundID);&lt;br /&gt;            &lt;br /&gt;            if (error == kAudioServicesNoError) { // success&lt;br /&gt;                _soundID = aSoundID;&lt;br /&gt;            } else {&lt;br /&gt;                NSLog(@"Error %d loading sound at path: %@", error, path);&lt;br /&gt;                [self release], self = nil;&lt;br /&gt;            }&lt;br /&gt;        } else {&lt;br /&gt;            NSLog(@"NSURL is nil for path: %@", path);&lt;br /&gt;            [self release], self = nil;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    return self;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)dealloc {&lt;br /&gt;    AudioServicesDisposeSystemSoundID(_soundID);&lt;br /&gt;    [super dealloc];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;-(void)play {&lt;br /&gt;    AudioServicesPlaySystemSound(_soundID);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Также в проект необходимо добавить ссылку на AudioToolbox.framework.&lt;br /&gt;Пример использования:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;SoundEffect *sound = [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"sound" ofType:@"caf"]];&lt;br /&gt;[sound play];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-3864956380818787264?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/3864956380818787264/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/iphone.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/3864956380818787264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/3864956380818787264'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/iphone.html' title='Звук в приложениях под iPhone'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-1296517716028133682</id><published>2009-08-01T16:21:00.017+03:00</published><updated>2009-08-01T18:28:46.435+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UIImage'/><title type='text'>UIImage scale methods</title><content type='html'>&lt;div style="text-align: justify;"&gt;При написании одной из программ возникла необходимость пропорционально изменить размер UIImage(в моем случае - изображения, полученного из Image Library iPhone). Далее описано решение, основанное на добавлении к классу UIImage нового метода imageByScalingAndCroppingForSize. &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span id="fullpost"&gt;&lt;br /&gt;Итак, чтобы пропрционально изменить размер UIImage (например, полученный с камеры), добавляем в проект:&lt;br /&gt;&lt;br /&gt;UIImageExtras.h&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;@interface UIImage (Extras)&lt;br /&gt;- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;UIImageExtras.m&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt;#import "UIImageExtras.h"&lt;br /&gt;&lt;br /&gt;@implementation UIImage (Extras)&lt;br /&gt;&lt;br /&gt;- (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize&lt;br /&gt;{&lt;br /&gt; UIImage *sourceImage = self;&lt;br /&gt; UIImage *newImage = nil;       &lt;br /&gt; CGSize imageSize = sourceImage.size;&lt;br /&gt; CGFloat width = imageSize.width;&lt;br /&gt; CGFloat height = imageSize.height;&lt;br /&gt; CGFloat targetWidth = targetSize.width;&lt;br /&gt; CGFloat targetHeight = targetSize.height;&lt;br /&gt; CGFloat scaleFactor = 0.0;&lt;br /&gt; CGFloat scaledWidth = targetWidth;&lt;br /&gt; CGFloat scaledHeight = targetHeight;&lt;br /&gt; CGPoint thumbnailPoint = CGPointMake(0.0,0.0);&lt;br /&gt; &lt;br /&gt; if (CGSizeEqualToSize(imageSize, targetSize) == NO)&lt;br /&gt; {&lt;br /&gt;        CGFloat widthFactor = targetWidth / width;&lt;br /&gt;        CGFloat heightFactor = targetHeight / height;&lt;br /&gt;  &lt;br /&gt;        if (widthFactor &gt; heightFactor)&lt;br /&gt;   scaleFactor = widthFactor; // scale to fit height&lt;br /&gt;        else&lt;br /&gt;   scaleFactor = heightFactor; // scale to fit width&lt;br /&gt;        scaledWidth  = width * scaleFactor;&lt;br /&gt;        scaledHeight = height * scaleFactor;&lt;br /&gt;  &lt;br /&gt;        // center the image&lt;br /&gt;        if (widthFactor &gt; heightFactor)&lt;br /&gt;  {&lt;br /&gt;   thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;&lt;br /&gt;  }&lt;br /&gt;        else&lt;br /&gt;   if (widthFactor &lt; heightFactor)&lt;br /&gt;   {&lt;br /&gt;    thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;&lt;br /&gt;   }&lt;br /&gt; }       &lt;br /&gt; &lt;br /&gt; UIGraphicsBeginImageContext(targetSize); // this will crop&lt;br /&gt; &lt;br /&gt; CGRect thumbnailRect = CGRectZero;&lt;br /&gt; thumbnailRect.origin = thumbnailPoint;&lt;br /&gt; thumbnailRect.size.width  = scaledWidth;&lt;br /&gt; thumbnailRect.size.height = scaledHeight;&lt;br /&gt; &lt;br /&gt; [sourceImage drawInRect:thumbnailRect];&lt;br /&gt; &lt;br /&gt; newImage = UIGraphicsGetImageFromCurrentImageContext();&lt;br /&gt; if(newImage == nil)&lt;br /&gt;        NSLog(@"could not scale image");&lt;br /&gt; &lt;br /&gt; //pop the context to get back to the default&lt;br /&gt; UIGraphicsEndImageContext();&lt;br /&gt; return newImage;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;@end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Пример использования:&lt;br /&gt;&lt;pre class="prettyprint"&gt;&lt;br /&gt; UIImage *orgImage = [UIImage imageWithContentsOfFile:@"filename.png"];&lt;br /&gt;&lt;br /&gt; if( orgImage == nil ){&lt;br /&gt;     NSLog(@"Error! Image not found!");&lt;br /&gt;     return;&lt;br /&gt; }&lt;br /&gt; orgImage = [orgImage imageByScalingAndCroppingForSize:CGSizeMake(480, 320)];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-1296517716028133682?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/1296517716028133682/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/uiimage-scale-methods.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/1296517716028133682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/1296517716028133682'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/08/uiimage-scale-methods.html' title='UIImage scale methods'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6429545539076699458.post-4612001730595658373</id><published>2009-07-01T19:00:00.006+03:00</published><updated>2009-08-24T00:01:43.622+03:00</updated><title type='text'>Links</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Games engines for iPhone:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/cocos2d-iphone/"&gt;Cocos2d project&lt;/a&gt;&lt;br /&gt;&lt;a href="http://sio2interactive.com/HOME/HOME.html"&gt;SIO2 open source 3d games engine&lt;/a&gt;&lt;br /&gt;&lt;a href="http://unity3d.com/"&gt;Unity3d engine&lt;/a&gt;&lt;br /&gt;&lt;a href="http://oolongengine.com/"&gt;Oolong engine&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.stonetrip.com/"&gt;Shiva Ston3d&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bork3d.com/"&gt;Bork 3D&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.garagegames.com/products/tge/iphone"&gt;iTGE&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.garagegames.com/products/torque-2d/iphone"&gt;iTGB&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/chipmunk-physics/"&gt;Chipmunk Physics Engine&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.box2d.org/"&gt;Box2D Physics Engine&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.gphysics.com/"&gt;Game Physics Erin’s Physics Weblog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Icons for toolbar&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.glyfx.com/products/free_iphone.html"&gt;iPhone common icon set&lt;/a&gt;&lt;br /&gt;&lt;a href="http://glyphish.com/"&gt;Icons and resources for iPhone developers&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Sites&lt;/span&gt;&lt;br /&gt;&lt;a href="http://gamedev.ru/"&gt;http://gamedev.ru&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ericasadun.com/"&gt;http://ericasadun.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.sapusmedia.com/"&gt;http://blog.sapusmedia.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cocoawithlove.com/"&gt;http://cocoawithlove.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://devmac.ru/"&gt;http://devmac.ru/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://iphonedevelopmentbits.com/"&gt;http://iphonedevelopmentbits.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://kwigbo.com/wp/"&gt;http://kwigbo.com/wp/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://majicjungle.com/blog/?p=123"&gt;http://majicjungle.com/blog/?p=123&lt;/a&gt;&lt;br /&gt;&lt;a href="http://iphonedev.net/"&gt;http://iphonedev.net/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://maniacdev.com/"&gt;http://maniacdev.com/&lt;/a&gt;&lt;br /&gt;&lt;a href="http://morethanmachine.com/macdev"&gt;http://morethanmachine.com/macdev&lt;/a&gt;&lt;br /&gt;&lt;a href="http://silentmac.com/"&gt;http://silentmac.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://theocacao.com/"&gt;http://theocacao.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.idevgames.com/"&gt;http://www.idevgames.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.mulle-kybernetik.com/artikel/Optimization"&gt;http://www.mulle-kybernetik.com/artikel/Optimization&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.bit-101.com/"&gt;http://www.bit-101.com&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mitchallen.com/iphone/"&gt;http://mitchallen.com/iphone&lt;/a&gt;&lt;br /&gt;&lt;a href="http://iphonedevelopment.blogspot.com/"&gt;http://iphonedevelopment.blogspot.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Books&lt;/span&gt;&lt;br /&gt;&lt;a href="http://books.google.com.ua/books?id=jiwEcrb_H0EC&amp;dq=iphone+record+sound+audio+toolbox&amp;hl=ru&amp;source=gbs_navlinks_s"&gt;Jonathan Zdziarski - Iphone Sdk Application Development&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6429545539076699458-4612001730595658373?l=maxscheglov.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://maxscheglov.blogspot.com/feeds/4612001730595658373/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://maxscheglov.blogspot.com/2009/01/chipmunk-project.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/4612001730595658373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6429545539076699458/posts/default/4612001730595658373'/><link rel='alternate' type='text/html' href='http://maxscheglov.blogspot.com/2009/01/chipmunk-project.html' title='Links'/><author><name>Scheglov Maxim</name><uri>http://www.blogger.com/profile/13999582452051097700</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://1.bp.blogspot.com/_JOC-D5fbBe8/SmTDe3V35QI/AAAAAAAAAAM/uJ6jsL7xCm4/S220/scheglov.jpg'/></author><thr:total>0</thr:total></entry></feed>
