<?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-2157525628671146945</id><updated>2012-01-22T01:38:18.449+07:00</updated><category term='ibatis'/><category term='facebook'/><category term='calendar'/><category term='lecture note'/><category term='installation'/><category term='java'/><category term='howto'/><category term='note'/><category term='apple'/><category term='keynote'/><category term='tutorial'/><category term='quote'/><category term='map'/><category term='ipad'/><category term='self'/><category term='meeting'/><category term='creative commons'/><category term='api'/><category term='how'/><category term='quiz'/><category term='flex'/><category term='requirement'/><category term='phone'/><category term='oracle'/><category term='tip'/><category term='cocoa'/><category term='core graphic'/><category term='objective-c'/><category term='grails'/><category term='travel'/><category term='iphone'/><category term='plugin'/><category term='groovy'/><category term='object oriented'/><category term='jasper report'/><category term='mac'/><category term='icon'/><category term='macbook'/><category term='gimp'/><category term='vim'/><category term='fun'/><category term='slide'/><category term='sit'/><category term='iOS'/><category term='recipes'/><category term='social network'/><category term='database'/><title type='text'>khomkrit | Objective-C, iOS</title><subtitle type='html'>iOS, iPhone/iPad, Objective-C, Cocoa Touch, Quick Tutorial&amp;amp;Tips</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.khomkrit.net/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default?start-index=101&amp;max-results=100'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>119</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2300697925810229894</id><published>2011-11-20T09:05:00.001+07:00</published><updated>2011-11-20T11:12:00.711+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>JSON บน iOS 5</title><content type='html'>ปัจจุบันเราคงปฏิเสธไม่ได้ว่าเราใช้ &lt;a href="http://www.json.org/"&gt;JSON&lt;/a&gt; กันบ่อยขึ้น และในวงกว้างขึ้นเรื่อยๆ&lt;br /&gt;&lt;div&gt;เดิมหากจะทำอะไรกับ JSON เราก็จะมักจะต้องพึ่งพา third party library อยู่เสมอ แต่เมื่อมาถึงยุคของ &lt;a href="http://www.apple.com/ios"&gt;iOS 5&lt;/a&gt; &amp;nbsp;Apple ก็ได้เพิ่ม JSON library เข้ามาให้เราพร้อมใช้ได้ง่ายๆ แล้ว&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ทำให้เราสามารถแปลง Object อย่าง NSString, NSNumber, NSArray หรือ NSDictionary ให้กลายเป็น JSON ได้ง่ายๆ โดยไม่จำเป็นต้องพึ่งพา third party library อีกต่อไป&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;พระเอกของงานนี้ก็คือ&amp;nbsp;&lt;a href="http://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html"&gt;NSJSONSerialization&lt;/a&gt;&amp;nbsp; เราจะใช้มันช่วยในการแปลง Object ให้กลายเป็น JSON และแปลงจาก JSON กลับมาเป็น Object ได้ ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;แปลง JSON Data ให้กลายเป็น Object&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #008423; font: 14.0px 'Arial Unicode MS'; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black; font: normal normal normal 14px/normal Menlo;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt;// &lt;/span&gt;สมมติว่าเราได้รับ&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt; data &lt;/span&gt;มาจากอินเทอร์เน็ต&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;&amp;nbsp; &amp;nbsp; NSData&lt;/span&gt;* data = [NSData dataWithContentsOfURL:&amp;nbsp;[NSURL URLWithString: urlString]];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px 'Arial Unicode MS'; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black; font: normal normal normal 14px/normal Menlo;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt;// &lt;/span&gt;แปลงเป็น&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt; Object &lt;/span&gt;ด้วยพระเอกของเรา&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: #733ea4; font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp; NSDictionary&lt;span style="color: black;"&gt;* json = [&lt;/span&gt;NSJSONSerialization&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #401f7d;"&gt;JSONObjectWithData&lt;/span&gt;&lt;span style="color: black;"&gt;: data&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #401f7d;"&gt;options&lt;/span&gt;:&amp;nbsp;&lt;span style="color: #401f7d;"&gt;kNilOptions&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #401f7d;"&gt;error&lt;/span&gt;: &amp;amp;error];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;สำหรับ options ของการแปลง JSON ให้กลายเป็น Object นั้น จะเกี่ยวกับเรื่องการความต้องการให้สิ่งที่แปลงออกมามีลักษณะเป็นอย่างไรในลักษณะของ Mutable หรือ Immutable &amp;nbsp;และอยากจะให้ top level object แยกกันเป็น array หรือ dictionary หรือไม่ &lt;a href="http://developer.apple.com/library/mac/#documentation/Foundation/Reference/NSJSONSerialization_Class/Reference/Reference.html#//apple_ref/doc/c_ref/NSJSONReadingOptions"&gt;อ่านรายละเอียด options ได้ที่นี่&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;แปลง Object เป็น JSON Data&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #008423; font-family: 'Arial Unicode MS'; font-size: 14px;"&gt;&lt;span style="color: black; font: normal normal normal 14px/normal Menlo;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: #008423; font-family: 'Arial Unicode MS'; font-size: 14px;"&gt;&lt;span style="color: black; font: normal normal normal 14px/normal Menlo;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #008423; font-family: 'Arial Unicode MS'; font-size: 14px;"&gt;&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt;// เริ่มจาก&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #008423; font-family: 'Arial Unicode MS'; font-size: 14px;"&gt;เรามี Object ที่ต้องการแปลงเป็น JSON&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #733ea4;"&gt;NSDictionary&lt;/span&gt;* objectInfo = ...&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px 'Arial Unicode MS'; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black; font: normal normal normal 14px/normal Menlo;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt;// &lt;/span&gt;แปลงเป็น&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt; JSON &lt;/span&gt;ด้วยพระเอกของเรา&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: #733ea4; font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;/div&gt;&lt;div style="color: black; font-family: Times; font-size: medium;"&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #733ea4;"&gt;NSData&lt;/span&gt;* jsonData = [&lt;span style="color: #733ea4;"&gt;NSJSONSerialization&lt;/span&gt;&amp;nbsp;&lt;span style="color: #401f7d;"&gt;dataWithJSONObject&lt;/span&gt;: objectInfo&amp;nbsp;&lt;/div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #401f7d;"&gt;options&lt;/span&gt;:&amp;nbsp;&lt;span style="color: #401f7d;"&gt;NSJSONWritingPrettyPrinted&lt;/span&gt;&lt;/div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #401f7d;"&gt;error&lt;/span&gt;: &amp;amp;error];&lt;/div&gt;&lt;/div&gt;&lt;div style="color: black; font-family: Times; font-size: medium;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: black; font-family: Times; font-size: medium;"&gt;&lt;div style="color: #008423; font: normal normal normal 14px/normal 'Arial Unicode MS'; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span style="color: black; font: normal normal normal 14px/normal Menlo;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt;//&amp;nbsp;&lt;/span&gt;ลองดูหน้าตาของ&lt;span style="font: normal normal normal 14px/normal Menlo;"&gt;&amp;nbsp;JSON&amp;nbsp;&lt;/span&gt;ที่เราแปลงได้&lt;/div&gt;&lt;/div&gt;&lt;div style="color: black; font-family: Times; font-size: medium;"&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #733ea4;"&gt;NSString&lt;/span&gt;&amp;nbsp;*jsonString = [[&lt;span style="color: #733ea4;"&gt;NSString&lt;/span&gt;&amp;nbsp;&lt;span style="color: #401f7d;"&gt;alloc&lt;/span&gt;]&amp;nbsp;&lt;span style="color: #401f7d;"&gt;initWithData&lt;/span&gt;:jsonData&lt;/div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #401f7d;"&gt;encoding&lt;/span&gt;:&lt;span style="color: #401f7d;"&gt;NSUTF8StringEncoding&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="color: #733ea4; font: normal normal normal 14px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;กรณีนี้ถ้าหากเราต้องการส่งข้อมูลไปที่อื่นๆ เช่นส่งไปยัง server เราสามารถกำหนด option เป็น&amp;nbsp;&lt;span class="Apple-style-span" style="color: #401f7d; font-family: Menlo; font-size: 14px;"&gt;kNilOptions&lt;/span&gt;&amp;nbsp;ได้ เพื่อตัดอักขระส่วนที่ไม่จำเป็นออกไป แต่ที่เรากำหนด options เป็น&amp;nbsp;&lt;span class="Apple-style-span" style="color: #401f7d; font-family: Menlo; font-size: 14px;"&gt;NSJSONWritingPrettyPrinted&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;ก็เพื่อให้เราสามารถอ่านได้ง่ายนั่นเอง&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;เพียงเท่านี้เราก็สามารถทำงานร่วมกับ JSON ได้อย่างมีความสุขแล้ว&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2300697925810229894?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2300697925810229894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/11/json-ios-5.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2300697925810229894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2300697925810229894'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/11/json-ios-5.html' title='JSON บน iOS 5'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-4921431341238749626</id><published>2011-11-11T16:46:00.000+07:00</published><updated>2011-12-07T22:57:10.244+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='map'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>พักผ่อนที่ The Living Hill Resort</title><content type='html'>เคยไปพักผ่อนมาหลายๆ ที่ แต่ที่ The Living Hill Resort นี่ต้องเขียนถึงสักหน่อย เนื่องจากเป็นรีสอร์ทที่มีประวัติโชกโชนอยู่ในเว็บไซต์ชื่อดังหลายเว็บ ลองหาดูจะพบว่าชื่อเสียงในทางลบจะค่อนข้างเยอะนิดนึง ชวนให้คนไม่กล้าไปพักกันสักเท่าไหร่&lt;br /&gt;&lt;br /&gt;คำชม&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;พนักงานพูดจาดีมาก บริการก็ดีมากเลย ดูเป็นกันเองคอยช่วยเหลือนู่นนี่ โทรมาถามไถ่เป็นห่วงว่าเราจะหารีสอร์ทไม่เจอด้วยล่ะ (แหงล่ะ ทางไปซับซ้อนมาก)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;เงียบสงบ ที่พักคนน้อยดี (อาจเพราะไปวันที่คนน้อย) มีที่นั่งชิลๆ ตากลมเย็นๆ สบายดีจัง&amp;nbsp;มีดาดฟ้าให้นอนดูดาวตอนกลางคืนด้วยถ้าโชคดีไปวันที่ฟ้าเปิด&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;ที่พักอยู่บนยอดเนินเขาสูง มองไปเห็นวิวรอบๆ ตัวเป็นแนวเขายาวล้อมรอบ มีลมพัดเย็นตลอด&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;ไม่ได้แย่อย่างที่ในเว็บส่วนใหญ่ที่หาเจอบ่นๆ กัน&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;ถ้าไม่มีดีลคงไม่ไป ห้องแพงเกิน แต่ถ้า 2 พันเหมือนเดิมมีโอกาสอาจไปพักอีกสัก 2-3 วัน&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;สัญญาณ truemove ชัดเจนใช้ได้ ทำให้ผมมี Google Map นำทางไปจนถึงจนได้ ไม่งั้นหลงชัวร์&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;ระหว่างทางแวะกินสเต๊กและไอติมอร่อยๆ ที่&lt;a href="https://foursquare.com/v/dairy-home-farm-shop/4bdd3ddb4ffaa59394196ff7"&gt;ร้าน Dairy Home&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://th-th.facebook.com/pages/The-Living-Hill-Resort/100160216731237?sk=photos"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;รูป&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;คำติ:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;โทรศัพท์ติดต่อรีสอร์ทติดยากมาก (ดังคนเขาว่า) ถ้าเทียบกับรีสอร์ทที่อื่นๆ ที่เคยไปพัก&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;ตอนเช้างง ไม่รู้ว่าอาหารเช้าไปเอาตรงไหน ที่ไหนได้เดินลงมาแล้วจะมีพนักงานมาถามว่าห้องไหน แล้วจะมีคนเอามาเสริฟให้เลยถึงที่&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;a href="http://www.thelivinghill.com/location.html"&gt;แผนที่ในเว็บ thelivinghill.com&lt;/a&gt; การเดินทางไปไม่ชัดเจน เขียนแค่นั้นใครจะเดินทางไปถูก -_-" หลงได้ง่ายๆ เลย เส้นทางก็วกวนซับซ้อน ผมโชคดีที่คนรู้จักไปพักมาก่อน แล้วบันทึก location ไว้เลยเปิด Google Map ตามไปได้ไม่ยาก (ลองเทียบ&lt;a href="http://www.thelivinghill.com/location.html"&gt;แผนที่จากในเว็บ&lt;/a&gt; กับแผนที่ใน Google Map ดูสิ ว่ามันช่างต่างกันมากเหลือเกิน)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;หาที่นี่ไม่เจอใน Google Map&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe frameborder="0" height="350" marginheight="0" marginwidth="0" scrolling="no" src="http://maps.google.com/maps?f=d&amp;amp;source=s_d&amp;amp;saddr=Thanon+Charan+Sanitwong&amp;amp;daddr=14.3855758,101.705257+to:14.37248,101.7221+to:Unknown+road&amp;amp;hl=en&amp;amp;geocode=FUZa0gAd5HL9BQ%3BFaeB2wAdKeYPBilPEDmLXxUcMTGxwVKYz2kEEw%3BFYBO2wAd9CcQBikLxoeRThUcMTFB1FKYz2kEEw%3BFVSz2wAdeOkQBg&amp;amp;sll=14.394903,101.772838&amp;amp;sspn=0.028308,0.045362&amp;amp;vpsrc=0&amp;amp;dirflg=ht&amp;amp;mra=dme&amp;amp;mrsp=3&amp;amp;sz=15&amp;amp;via=1,2&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;ll=14.394903,101.772838&amp;amp;spn=0.028308,0.045362&amp;amp;output=embed" width="425"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=d&amp;amp;source=embed&amp;amp;saddr=Thanon+Charan+Sanitwong&amp;amp;daddr=14.3855758,101.705257+to:14.37248,101.7221+to:Unknown+road&amp;amp;hl=en&amp;amp;geocode=FUZa0gAd5HL9BQ%3BFaeB2wAdKeYPBilPEDmLXxUcMTGxwVKYz2kEEw%3BFYBO2wAd9CcQBikLxoeRThUcMTFB1FKYz2kEEw%3BFVSz2wAdeOkQBg&amp;amp;sll=14.394903,101.772838&amp;amp;sspn=0.028308,0.045362&amp;amp;vpsrc=0&amp;amp;dirflg=ht&amp;amp;mra=dme&amp;amp;mrsp=3&amp;amp;sz=15&amp;amp;via=1,2&amp;amp;ie=UTF8&amp;amp;t=h&amp;amp;ll=14.394903,101.772838&amp;amp;spn=0.028308,0.045362" style="color: blue; text-align: left;"&gt;View Larger Map&lt;/a&gt;&amp;nbsp;แผนที่ The Living Hill Resort จากแยกบางพลัด กรุงเทพ ไปถึงทางเข้า The Living Hill Resort&lt;/small&gt;&lt;br /&gt;&lt;small&gt;&lt;br /&gt;&lt;/small&gt;&lt;br /&gt;แสดงตำแหน่ง วิธีการเดินทางไป และสถานที่ตั้งของ The Living Hill Resort&lt;br /&gt;ถึงจุด B แล้วให้เลี้ยวขวาไปครับ จะเป็นทางดิน ขึ้นเนินชันมาก&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-4921431341238749626?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/4921431341238749626/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/11/living-hill-resort.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4921431341238749626'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4921431341238749626'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/11/living-hill-resort.html' title='พักผ่อนที่ The Living Hill Resort'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-6461786685901535546</id><published>2011-10-06T22:26:00.001+07:00</published><updated>2011-10-06T22:26:03.536+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>ลาก่อน สตีฟ จ็อบส์</title><content type='html'>สู่สุขติเถิด ลาก่อนสตีฟ จ็อบส์​&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--JP7b5Ly33I/To3HsXoSdpI/AAAAAAAADhM/f6cLHuj0eys/s1600/Screen+Shot+2554-10-06+at+10.20.17+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" id=":current_picnik_image" src="http://1.bp.blogspot.com/--JP7b5Ly33I/To3HsXoSdpI/AAAAAAAADhM/f6cLHuj0eys/s400/Screen+Shot+2554-10-06+at+10.20.17+PM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a href="http://37signals.com/svn/posts/3021-steve-jobs-changed"&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;He changed them.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;He changed us.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #222222; font-family: verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;He changed you.&lt;/span&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-6461786685901535546?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/6461786685901535546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/10/blog-post.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/6461786685901535546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/6461786685901535546'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/10/blog-post.html' title='ลาก่อน สตีฟ จ็อบส์'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/--JP7b5Ly33I/To3HsXoSdpI/AAAAAAAADhM/f6cLHuj0eys/s72-c/Screen+Shot+2554-10-06+at+10.20.17+PM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-3513966999328070622</id><published>2011-10-06T21:12:00.001+07:00</published><updated>2011-11-21T19:22:38.755+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='how'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='core graphic'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>วาดกราฟใน iOS ด้วย CoreGraphic</title><content type='html'>เห็นหลายๆ App มีการวาดกราฟสวยๆ กัน โดยเฉพาะ App เกี่ยวกับหุ้นเช่น&amp;nbsp;&lt;a href="http://itunes.apple.com/us/app/bloomberg/id281941097?mt=8"&gt;App ของ Bloomberg&lt;/a&gt; เป็นต้น จึงลองวาดเล่นดูสักหน่อย ถือเป็นการทบทวนทักษะทางด้าน CoreGraphic ก็แล้วกัน เพราะตั้งแต่ทำงานมาแทบไม่ได้ใช้ทักษะทางด้านนี้เลย&lt;br /&gt;&lt;br /&gt;โดยรูปเป้าหมายที่ต้องการ จะมีหน้าตาดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-2L4Mz_THs20/To2mvpKHlcI/AAAAAAAADg0/jda2YmuM8xM/s1600/Screen+Shot+2554-10-06+at+8.01.15+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-2L4Mz_THs20/To2mvpKHlcI/AAAAAAAADg0/jda2YmuM8xM/s1600/Screen+Shot+2554-10-06+at+8.01.15+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;หลักการการวาดรูปต่างๆ ลงไปก็คือเราจะเข้าไป override method&amp;nbsp;&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;- (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: #c2339f;"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;)drawRect:(&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: #6f46a6;"&gt;CGRect&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;)rect&lt;/span&gt;&amp;nbsp;ของ UIView และสั่งวาดสิ่งต่างๆ ข้างใน method นี้&lt;br /&gt;&lt;br /&gt;เมื่อเราต้องการวาดอะไรลงไปก็ตาม เราต้องการสิ่งที่เรียกว่า&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;context&lt;/span&gt;&amp;nbsp;และเพื่อให้เข้าใจได้ง่ายๆ ให้มองว่า&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;context&lt;/span&gt;&amp;nbsp;ตัวนี้ก็คือผืนผ้าใบที่เราจะวาดสิ่งต่างๆ ลงไปนั่นเอง ดังนั้นเมื่อเราจะเริ่มทำอะไร เราต้องได้ context มาก่อน เพื่อเอาไว้ใช้อ้างอิงในภายหลัง ว่าเราจะทำอะไร จะวาดอะไรลงไปใน context (ผืนผ้าใบ) อันนี้ (context เป็น stateful ซึ่งแปลว่าหากเรากำหนดค่าอะไรให้มันไปแล้ว มันก็จะยังคงค่านั้นเสมอ จนกว่าเราจะเปลี่ยนแปลงค่าให้มันเองในภายหลัง) ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// get current context&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGContextRef&lt;/span&gt;&lt;span style="color: black;"&gt; context = &lt;/span&gt;UIGraphicsGetCurrentContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เริ่มจากการวาดเส้นประ (dash) ที่เป็นพื้นหลังของกราฟก่อน&amp;nbsp;เริ่มวาดเส้นประ (dash) โดยกำหนดความกว้างของเส้น สีที่จะวาด ลักษณะของเส้นประ ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// draw bg line&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSaveGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetLineWidth&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;1.0&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetStrokeColorWithColor&lt;span style="color: black;"&gt;(context, [&lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;UIColor&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;lightGrayColor&lt;span style="color: black;"&gt;].&lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGColor&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;CGFloat&lt;/span&gt; dashArray[] = {&lt;span style="color: #0041d3;"&gt;4&lt;/span&gt;,&lt;span style="color: #0041d3;"&gt;4&lt;/span&gt;,&lt;span style="color: #0041d3;"&gt;4&lt;/span&gt;,&lt;span style="color: #0041d3;"&gt;4&lt;/span&gt;};&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextSetLineDash&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;3&lt;/span&gt;, dashArray, &lt;span style="color: #0041d3;"&gt;4&lt;/span&gt;);&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;เมื่อเรากำหนดลักษณะของเส้นที่จะวาดเรียบร้อยแล้ว ต่อไปก็กำหนดเส้นที่จะวาด ว่าจะวาดเส้นโดยเริ่มจากจุดไหน ไปถึงจุดไหนดังนี้&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #c2339f;"&gt;for&lt;/span&gt;(&lt;span style="color: #c2339f;"&gt;int&lt;/span&gt; i = &lt;span style="color: #0041d3;"&gt;50&lt;/span&gt;; i &amp;lt;= &lt;span style="color: #0041d3;"&gt;300&lt;/span&gt;; i += &lt;span style="color: #0041d3;"&gt;50&lt;/span&gt;){&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextMoveToPoint&lt;/span&gt;(context, i, &lt;span style="color: #0041d3;"&gt;200&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextAddLineToPoint&lt;/span&gt;(context, i, &lt;span style="color: #0041d3;"&gt;480&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextMoveToPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;, &lt;span style="color: #0041d3;"&gt;200&lt;/span&gt; + i);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextAddLineToPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;320&lt;/span&gt;, &lt;span style="color: #0041d3;"&gt;200&lt;/span&gt; + i);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;เมื่อกำหนดเส้นที่จะวาดเรียบร้อยแล้ว ก็สั่งให้วาดลงไปใน context (ผืนผ้าใบ) ด้วยฟังก์ชั่น&amp;nbsp;&lt;span class="Apple-style-span" style="color: #39287e; font-family: Menlo; font-size: 14px;"&gt;CGContextStrokePath&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #39287e; font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: black;"&gt;(context)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;ได้เลย&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;CGContextStrokePath&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextRestoreGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;สำหรับความหมายของ&amp;nbsp;&lt;span class="Apple-style-span" style="color: #39287e; font-family: Menlo; font-size: 14px;"&gt;CGContextSaveGState&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #39287e; font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: black;"&gt;(context)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;และ&amp;nbsp;&lt;span class="Apple-style-span" style="color: #39287e; font-family: Menlo; font-size: 14px;"&gt;CGContextRestoreGState&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #39287e; font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: black;"&gt;(context)&lt;/span&gt;&lt;/span&gt;&amp;nbsp;ให้อ่านได้จาก&lt;a href="http://www.raywenderlich.com/2033/core-graphics-101-lines-rectangles-and-gradients"&gt;บทความนี้&lt;/a&gt;&amp;nbsp;สั้นๆ ก็คือมันเป็นการบันทึกสถานนะของการกำหนดค่าต่างๆ ให้กับ context หลังจากนั้นเมื่อเราทำอะไรเสร็จแล้ว เราก็จะย้อนกลับไปสถานะของ context ก่อนหน้าที่เราจะทำอะไรกับมันด้วยการ restore context นั่นเอง เมื่อเราสั่งให้วาดเส้นประแล้วเราจะได้ผลลัพธ์ดังนี้&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-dS-SHIUwqFI/To2nqucekDI/AAAAAAAADg8/dECVl7egSa8/s1600/Screen+Shot+2554-10-06+at+8.03.29+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-dS-SHIUwqFI/To2nqucekDI/AAAAAAAADg8/dECVl7egSa8/s1600/Screen+Shot+2554-10-06+at+8.03.29+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ถ้าหากเราสั่ง gradient ลงไปใน context ตอนนี้ เราจะได้ gradient เต็มหน้าจอเนื่องจาก context ของเราจะมีรูปร่างเป็นสี่เหลี่ยมผืนผ้าเต็มหน้าจอนั่นเอง แต่ที่เราต้องการจริงๆ ก็คือเราต้องการให้ gradient เฉพาะพื้นที่ใต้กราฟเท่านั้น ซึ่งเทคนิคที่เราจะใช้ก็คือ เราจะสร้าง shape ที่เป็นพื้นที่ใต้กราฟ จากนั้นเราจะ clip context ให้เป็นรูปเดียวกับ shape ที่เราวาดขึ้นมา จากนั้นจึงจะวาด gradient ลงไปใน context ที่ clip แล้ว&lt;br /&gt;&lt;br /&gt;สมมติว่าเรามีข้อมูลอยู่ 40 ชุด โดยเราสามารถ generate ข้อมูล 40 ชุดขึ้นมาได้ดังนี้ก่อน&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// generate 40 data, each limited to 150&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c2339f;"&gt;int&lt;/span&gt; r = &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c2339f;"&gt;int&lt;/span&gt; array[&lt;span style="color: #0041d3;"&gt;40&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c2339f;"&gt;for&lt;/span&gt;(&lt;span style="color: #c2339f;"&gt;int&lt;/span&gt; i = &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;; i &amp;lt;= &lt;span style="color: #0041d3;"&gt;40&lt;/span&gt;; i ++){&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; r = &lt;span style="color: #39287e;"&gt;arc4random&lt;/span&gt;() % &lt;span style="color: #0041d3;"&gt;150&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; array[i] = r;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เก็บ data ไว้ในตัวแปร array ขนาด 40 ต่อไปเราจะวาด Shape ที่ที่เป็นพื้นที่ใต้กราฟโดยอิงจากข้อมูล 40 ชุดที่เรามี ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// draw graph by points stored in array&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSaveGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextMoveToPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;, array[&lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;] + graphBase);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c2339f;"&gt;for&lt;/span&gt;(&lt;span style="color: #c2339f;"&gt;int&lt;/span&gt; i = &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;; i &amp;lt;= &lt;span style="color: #0041d3;"&gt;40&lt;/span&gt;; i ++){&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextAddLineToPoint&lt;/span&gt;(context, i * &lt;span style="color: #0041d3;"&gt;8&lt;/span&gt;, array[i] + graphBase);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// wrap it as a shape&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextAddLineToPoint&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;320&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;480&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextAddLineToPoint&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;480&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextAddLineToPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;, array[&lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;] + graphBase);&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetLineWidth&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;3&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetStrokeColorWithColor&lt;span style="color: black;"&gt;(context, [&lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;UIColor&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;redColor&lt;span style="color: black;"&gt;].&lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGColor&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextStrokePath&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextRestoreGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;เหมือนกับการวาดเส้นประในตอนแรก โดยเราจะวนลูปวาดเส้นไปทีละจุดๆ ใน array เมื่อวาดครบทุกจุดแล้วเราจะวาดย้อนกลับมายังจุดเริ่มต้นใหม่อีกครั้งให้เป็น Shape ปิด และเมื่อเราทดลองวาดเส้นเพื่อตรวจสอบ Shape ที่เราวาดขึ้นมา เราจะได้ Shape หน้าตาดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-nd7M81nCBPQ/To2u8EGNdiI/AAAAAAAADhA/QOpPEhQSAFo/s1600/Screen+Shot+2554-10-06+at+8.24.23+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-nd7M81nCBPQ/To2u8EGNdiI/AAAAAAAADhA/QOpPEhQSAFo/s1600/Screen+Shot+2554-10-06+at+8.24.23+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Shape ถูกวาดเส้นด้วยสีแดง ต่อไปเราจะทำการ clip Context ด้วย Shape ที่เราวาดขึ้นมาโดยใช้ฟังก์ชั่น&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: #39287e;"&gt;CGContextClip&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 14px;"&gt;(context)&lt;/span&gt;&amp;nbsp;และเอาโค้ดในการวาดเส้นสีแดงให้ Shape ออกไป ทำให้จากโค้ดด้านบนเราจะเหลือแบบนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// wrap it as a shape&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextAddLineToPoint&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;320&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;480&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextAddLineToPoint&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;480&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextAddLineToPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;, array[&lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;] + graphBase);&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetLineWidth&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;3&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetStrokeColorWithColor&lt;span style="color: black;"&gt;(context, [&lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;UIColor&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;redColor&lt;span style="color: black;"&gt;].&lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGColor&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextClip&lt;/span&gt;(context);&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ต่อไปจะวาด Gradient ลงไปใน context ที่เหลือจากการถูก clip โดยเริ่มจากการนิยาม Gradient ก่อนว่าจะให้มีลักษณะเป็นอย่างไร&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// gradient definition&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGColorSpaceRef&lt;/span&gt;&lt;span style="color: black;"&gt; colorSpace = &lt;/span&gt;CGColorSpaceCreateDeviceRGB&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;CGFloat&lt;/span&gt; locations[] = { &lt;span style="color: #0041d3;"&gt;0.55&lt;/span&gt;, &lt;span style="color: #0041d3;"&gt;1.0&lt;/span&gt;};&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;CGColorRef&lt;/span&gt; endColor = [&lt;span style="color: #6f46a6;"&gt;UIColor&lt;/span&gt; &lt;span style="color: #39287e;"&gt;colorWithRed&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;0.0f&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;green&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;153.0f&lt;/span&gt;/&lt;span style="color: #0041d3;"&gt;256.0f&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;blue&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;249.0f&lt;/span&gt;/&lt;span style="color: #0041d3;"&gt;256.0f&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;alpha&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;1.0&lt;/span&gt;].&lt;span style="color: #6f46a6;"&gt;CGColor&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;CGColorRef&lt;/span&gt; startColor = [&lt;span style="color: #6f46a6;"&gt;UIColor&lt;/span&gt; &lt;span style="color: #39287e;"&gt;colorWithRed&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;green&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;blue&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;alpha&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;0.5&lt;/span&gt;].&lt;span style="color: #6f46a6;"&gt;CGColor&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;NSArray&lt;/span&gt; *colors = [&lt;span style="color: #6f46a6;"&gt;NSArray&lt;/span&gt; &lt;span style="color: #39287e;"&gt;arrayWithObjects&lt;/span&gt;:(&lt;span style="color: #c2339f;"&gt;id&lt;/span&gt;)startColor, (&lt;span style="color: #c2339f;"&gt;id&lt;/span&gt;)endColor, &lt;span style="color: #c2339f;"&gt;nil&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;CGGradientRef&lt;/span&gt; gradient = &lt;span style="color: #39287e;"&gt;CGGradientCreateWithColors&lt;/span&gt;(colorSpace, (&lt;span style="color: #6f46a6;"&gt;CFArrayRef&lt;/span&gt;) colors, locations);&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGPoint&lt;/span&gt;&lt;span style="color: black;"&gt; startPoint = &lt;/span&gt;CGPointMake&lt;span style="color: black;"&gt;(&lt;/span&gt;CGRectGetMidX&lt;span style="color: black;"&gt;(rect), &lt;/span&gt;CGRectGetMinY&lt;span style="color: black;"&gt;(rect));&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGPoint&lt;/span&gt;&lt;span style="color: black;"&gt; endPoint = &lt;/span&gt;CGPointMake&lt;span style="color: black;"&gt;(&lt;/span&gt;CGRectGetMidX&lt;span style="color: black;"&gt;(rect), &lt;/span&gt;CGRectGetMaxY&lt;span style="color: black;"&gt;(rect));&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;โค๊ด เป็นการกำหนด color space (ส่วนใหญ่แทบทั้งหมดจะใช้ RGB) &amp;nbsp;กำหนดตำแหน่งของสีที่จะใช้วาด gradient กำหนดสีเริ่มต้น และสีปลายของ gradient กำหนดจุดเริ่มต้นของ gradient และจุดปลายของ gradient&lt;br /&gt;&lt;br /&gt;วาด gradient ลงไปใน context ที่ clip ไปแล้ว และ restore state เดินกลับมาแบบนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #39287e;"&gt;CGContextDrawLinearGradient&lt;/span&gt;(context, gradient, startPoint, endPoint, &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextRestoreGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จะได้ผลลัพธ์ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-DHEnQgajd9g/To2w4QMeIjI/AAAAAAAADhE/QaPa2iM3j68/s1600/Screen+Shot+2554-10-06+at+8.44.14+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-DHEnQgajd9g/To2w4QMeIjI/AAAAAAAADhE/QaPa2iM3j68/s1600/Screen+Shot+2554-10-06+at+8.44.14+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เราได้ gradient ใต้กราฟมาแล้ว ต่อไปเราจะวาดเส้นกันล่ะ โดยจะวนลูปวาดเส้นจากข้อมูลทั้ง 40 จุดที่เรามี ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// draw graph line&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #6f46a6;"&gt;CGColorRef&lt;/span&gt; graphColor = [&lt;span style="color: #6f46a6;"&gt;UIColor&lt;/span&gt; &lt;span style="color: #39287e;"&gt;colorWithRed&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;0.0f&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;green&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;153.0f&lt;/span&gt;/&lt;span style="color: #0041d3;"&gt;256.0f&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;blue&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;249.0f&lt;/span&gt;/&lt;span style="color: #0041d3;"&gt;256.0f&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;alpha&lt;/span&gt;:&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;].&lt;span style="color: #6f46a6;"&gt;CGColor&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSaveGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetStrokeColorWithColor&lt;span style="color: black;"&gt;(context, graphColor);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetLineWidth&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;3&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextMoveToPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;, array[&lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;]);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c2339f;"&gt;for&lt;/span&gt;(&lt;span style="color: #c2339f;"&gt;int&lt;/span&gt; i = &lt;span style="color: #0041d3;"&gt;0&lt;/span&gt;; i &amp;lt;= &lt;span style="color: #0041d3;"&gt;40&lt;/span&gt;; i ++){&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextAddLineToPoint&lt;/span&gt;(context, i * &lt;span style="color: #0041d3;"&gt;8&lt;/span&gt;, array[i]);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextStrokePath&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextRestoreGState&lt;span style="color: black;"&gt;(context);&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;กำหนดสีที่จะวาด จากนั้นลูปวาดเส้นตามจุดต่างๆ ตามข้อมูลทั้ง 40 จุดที่เรามี เราก็จะได้กราฟหน้าตาแบบนี้ออกมาแล้ว&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-LVTx0tgMzLI/To2yrUZL-sI/AAAAAAAADhI/nYZ55FTtcSQ/s1600/Screen+Shot+2554-10-06+at+8.51.43+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-LVTx0tgMzLI/To2yrUZL-sI/AAAAAAAADhI/nYZ55FTtcSQ/s1600/Screen+Shot+2554-10-06+at+8.51.43+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ส่วนการวาด text หรือข้อความลงไปด้วย CoreGraphic นั้น ถ้าหากเราสั่งวาดแบบปกติลงไป เราจะได้ข้อความที่กลับหัว ต้อง transform มันด้วยโดยการกำหนด text matrix ก่อนการสั่งวาด ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #00821c; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;// draw text&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #c2339f;"&gt;char&lt;/span&gt;* text =&lt;span style="color: #dc241f;"&gt;"Apple API"&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSelectFont&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #dc241f;"&gt;"Helvetica"&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;16&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;kCGEncodingMacRoman&lt;span style="color: black;"&gt;);&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetTextDrawingMode&lt;span style="color: black;"&gt;(context, &lt;/span&gt;kCGTextFill&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetRGBFillColor&lt;span style="color: black;"&gt;(context, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="color: #7d472d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #6f46a6;"&gt;CGAffineTransform&lt;/span&gt;&lt;span style="color: black;"&gt; xform = &lt;/span&gt;CGAffineTransformMake&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #0041d3;"&gt;1.0&lt;/span&gt;&lt;span style="color: black;"&gt;,&amp;nbsp; &lt;/span&gt;&lt;span style="color: #0041d3;"&gt;0.0&lt;/span&gt;&lt;span style="color: black;"&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0041d3;"&gt;0.0&lt;/span&gt;, -&lt;span style="color: #0041d3;"&gt;1.0&lt;/span&gt;,&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #0041d3;"&gt;0.0&lt;/span&gt;,&amp;nbsp; &lt;span style="color: #0041d3;"&gt;0.0&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #39287e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;CGContextSetTextMatrix&lt;span style="color: black;"&gt;(context, xform);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #39287e;"&gt;CGContextShowTextAtPoint&lt;/span&gt;(context, &lt;span style="color: #0041d3;"&gt;120&lt;/span&gt;, &lt;span style="color: #0041d3;"&gt;450&lt;/span&gt;, text, &lt;span style="color: #39287e;"&gt;strlen&lt;/span&gt;(text));&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ซอสโค้ดของตัวอย่างนี้&lt;a href="http://dl.dropbox.com/u/485425/permanent/blogspot/TestView.m"&gt;ดาวโหลดได้ที่นี่&lt;/a&gt;&amp;nbsp;หรือดาวน์โหลดจาก &lt;a href="https://github.com/khomkrit/GraphPath"&gt;GitHub&lt;/a&gt; ก็ได้&lt;br /&gt;&lt;br /&gt;อ้างอิง:&lt;br /&gt;&lt;a href="http://www.techotopia.com/index.php/An_iOS_4_iPad_Graphics_Drawing_Tutorial_using_Quartz_2D_(Xcode_4)#Dashed_Line_Drawing"&gt;An iOS 4 iPad Graphics Drawing Tutorial using Quartz 2D&lt;/a&gt;&lt;br /&gt;&lt;a href="http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007533-SW1"&gt;Quartz 2D Programming Guide&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://developer.apple.com/library/ios/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_paths/dq_paths.html%23//apple_ref/doc/uid/TP30001066-CH211-TPXREF126"&gt;Clipping to a Path&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://stackoverflow.com/questions/6760431/drawing-a-chart-with-gradient-in-objective-c"&gt;Stackoverflow&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-3513966999328070622?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/3513966999328070622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/10/ios-coregraphic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3513966999328070622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3513966999328070622'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/10/ios-coregraphic.html' title='วาดกราฟใน iOS ด้วย CoreGraphic'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-2L4Mz_THs20/To2mvpKHlcI/AAAAAAAADg0/jda2YmuM8xM/s72-c/Screen+Shot+2554-10-06+at+8.01.15+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1344527968742427154</id><published>2011-09-24T22:39:00.001+07:00</published><updated>2011-09-24T22:39:56.352+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>สั่งให้ UIView เคลื่อนที่แนวโค้ง</title><content type='html'>การสั่งให้ UIView ทั้งหลายแหล่เคลื่อนที่เป็นแนวเส้นตรงนั้นไม่ยาก เพียงแต่กำหนดจุดเริ่มต้น กับจุดปลายผ่านบล็อค&amp;nbsp;&lt;a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/clm/UIView/beginAnimations:context:"&gt;beginAnimations:context:&amp;nbsp;และ commitAnimations&lt;/a&gt; เท่านั้น&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;สำหรับการเคลื่อนที่ของ UIView เป็นเส้นโค้งนั้น หลักการก็คือเราจะกำหนดเส้นทางการเคลื่อนที่ให้มัน จากนั้นกำหนด animation ให้กับ layer ของ UIView ที่ต้องการให้เคลื่อนที่&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;ค้นหาเส้นทางการเคลื่อนที่&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;เราจะกำหนดเส้นทางการเคลื่อนที่ แบบเดียวกับการวาดเส้นโค้งอย่าง Bézier curve ซึ่งเจ้า&amp;nbsp;Bézier curve นี้ก็จะประกอบด้วยจุดเริ่ม จุดปลาย และจุดควบคุมหรือ control point (อ่านรายละเอียดเกี่ยวกับลักษณะของ&amp;nbsp;Bézier curve&amp;nbsp;&lt;a href="http://developer.apple.com/library/mac/#documentation/graphicsimaging/conceptual/drawingwithquartz2d/dq_paths/dq_paths.html#//apple_ref/doc/uid/TP30001066-CH211-SW1"&gt;ที่นี่&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ผมจะวาดเส้นโค้งขึ้น จากขอบทางซ้าย ไปทางขวาของจอ iPad ผมสามารถกำหนดเส้นโค้งได้ประมาณนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;CGMutablePathRef&lt;/span&gt;&lt;span style="color: black;"&gt; curvedPath = &lt;/span&gt;CGPathCreateMutable&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #401f7d;"&gt;CGPathMoveToPoint&lt;/span&gt;(curvedPath, &lt;span style="color: #be299d;"&gt;NULL&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;512&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGPathAddQuadCurveToPoint&lt;span style="color: black;"&gt;(curvedPath, &lt;/span&gt;&lt;span style="color: #be299d;"&gt;NULL&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;/&lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;2&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;512&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ซึ่งขนาดความโค้งว่าจะโค้งมากหรือน้อย โค้งขึ้นหรือโค้งลง สามารถกำหนดได้ที่จุดควบคุม จากโค๊ดด้านบนลองวาดออกมาเป็นเส้นดูจะได้เส้นหน้าตาแบบนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-RgEcBb09u0g/Tn31wX0z9uI/AAAAAAAADgs/LDAOfoG03HI/s1600/Screen+Shot+2554-09-24+at+10.21.17+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-RgEcBb09u0g/Tn31wX0z9uI/AAAAAAAADgs/LDAOfoG03HI/s320/Screen+Shot+2554-09-24+at+10.21.17+PM.png" width="310" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ส่วนวิธีการวาดนั้น สามารถทำได้ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Create a bitmap graphics context, you will later get a UIImage from this&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIGraphicsBeginImageContext&lt;span style="color: black;"&gt;(&lt;/span&gt;CGSizeMake&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;,&lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;1024&lt;/span&gt;&lt;span style="color: black;"&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;CGContextRef&lt;/span&gt;&lt;span style="color: black;"&gt; ctx = &lt;/span&gt;UIGraphicsGetCurrentContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Set variables in the context for drawing&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGContextSetLineWidth&lt;span style="color: black;"&gt;(ctx, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;1.5&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGContextSetStrokeColorWithColor&lt;span style="color: black;"&gt;(ctx, [&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;UIColor&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;redColor&lt;span style="color: black;"&gt;].&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;CGColor&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGContextMoveToPoint&lt;span style="color: black;"&gt;(ctx, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;512&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGContextAddQuadCurveToPoint&lt;span style="color: black;"&gt;(ctx, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;/&lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;2&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;512&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Draw the line&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGContextDrawPath&lt;span style="color: black;"&gt;(ctx, &lt;/span&gt;kCGPathStroke&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Get a UIImage from the current bitmap context we created at the start and then end the image context&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;UIImage&lt;/span&gt;&lt;span style="color: black;"&gt; *curve = &lt;/span&gt;UIGraphicsGetImageFromCurrentImageContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIGraphicsEndImageContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//With the image, we need a UIImageView&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;UIImageView&lt;/span&gt; *curveView = [[&lt;span style="color: #733ea4;"&gt;UIImageView&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #401f7d;"&gt;initWithImage&lt;/span&gt;:curve];&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Set the frame of the view - which is used to position it when we add it to our current UIView&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;curveView.&lt;span style="color: #733ea4;"&gt;frame&lt;/span&gt; = &lt;span style="color: #401f7d;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;1024&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;curveView.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;clearColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;[&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;.&lt;span style="color: #733ea4;"&gt;view&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;addSubview&lt;/span&gt;:curveView];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เมื่อดูจากเส้นที่วาดออกมาแล้ว พบว่าเป็นเส้นทางการเคลื่อนที่ในแนวโค้งที่เราต้องการ เราก็เอาจุดที่นิยาม&amp;nbsp;Bézier curve นี้แหละมาใช้งาน&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: large;"&gt;&lt;b&gt;กำหนดเส้นทางการเคลื่อนที่&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;เราจะใช้&amp;nbsp;&lt;span class="Apple-style-span" style="color: #733ea4; font-family: Menlo; font-size: 14px;"&gt;CAKeyframeAnimation&lt;/span&gt;&amp;nbsp;ในการกำหนดเส้นทางการเคลื่อนที่ โดยการกำหนดค่าต่างๆ ให้กับ&amp;nbsp;&lt;span class="Apple-style-span" style="color: #733ea4; font-family: Menlo; font-size: 14px;"&gt;CAKeyframeAnimation&lt;/span&gt;&amp;nbsp;ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Prepare the animation - we use keyframe animation for animations of this complexity&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CAKeyframeAnimation&lt;span style="color: black;"&gt; *pathAnimation = [&lt;/span&gt;CAKeyframeAnimation&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;animationWithKeyPath&lt;/span&gt;&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #d42722;"&gt;@"position"&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;pathAnimation.&lt;/span&gt;fillMode&lt;span style="color: black;"&gt; = &lt;/span&gt;kCAFillModeForwards&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;pathAnimation.&lt;/span&gt;removedOnCompletion&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #be299d;"&gt;NO&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;pathAnimation.&lt;span style="color: #733ea4;"&gt;duration&lt;/span&gt; = &lt;span style="color: #2f2fd1;"&gt;5.0&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;//Lets loop continuously for the demonstration&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;pathAnimation.&lt;span style="color: #733ea4;"&gt;repeatCount&lt;/span&gt; = &lt;span style="color: #2f2fd1;"&gt;1000&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;จากโค๊ดจะบอกว่าให้เล่น animation นี้ 5 นาทีต่อ 1 รอบ กำหนดให้เล่น 1000 รอบ สำหรับรายละเอียดของ property ตัวอื่นๆ ที่ไม่ได้กล่าวถึงแต่ละตัวสามารถอ่านได้จาก&lt;a href="http://Prepare the animation - we use keyframe animation for animations of this complexity CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@&amp;quot;position&amp;quot;]; pathAnimation.fillMode = kCAFillModeForwards; pathAnimation.removedOnCompletion = NO; pathAnimation.duration = 5.0; //Lets loop continuously for the demonstration pathAnimation.repeatCount = 1000;"&gt;ที่นี่&lt;/a&gt;เลย&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ต่อไปก็กำหนดเส้นทางเดินให้ animation ตัวนี้ล่ะ โดยใช้เส้นที่เราได้เลือกแล้วดังกล่าวไปข้างต้น ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;CGMutablePathRef&lt;/span&gt;&lt;span style="color: black;"&gt; curvedPath = &lt;/span&gt;CGPathCreateMutable&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #401f7d;"&gt;CGPathMoveToPoint&lt;/span&gt;(curvedPath, &lt;span style="color: #be299d;"&gt;NULL&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;512&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGPathAddQuadCurveToPoint&lt;span style="color: black;"&gt;(curvedPath, &lt;/span&gt;&lt;span style="color: #be299d;"&gt;NULL&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;/&lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;2&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;768&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;512&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;pathAnimation.&lt;span style="color: #733ea4;"&gt;path&lt;/span&gt; = curvedPath;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;CGPathRelease&lt;span style="color: black;"&gt;(curvedPath);&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เมื่อ animation และเส้นทางการเคลื่อนที่พร้อมแล้ว เราก็กำหนดเส้น animation นี้ให้กับ UIView ที่ต้องการได้เลย ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;[myView.layer addAnimation:pathAnimation forKey:&lt;span style="color: #d42722;"&gt;@"position"&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เราก็จะได้การเคลื่อนที่เป็นเส้นโค้งจากจุดต้นของเส้นทางซ้ายสุด ไปจุดปลายของเส้นทางขวาสุดสมใจ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-6zofzmOkOd8/Tn35GVddAgI/AAAAAAAADgw/KkCMa34ghmU/s1600/Screen+Shot+2554-09-24+at+8.59.05+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/-6zofzmOkOd8/Tn35GVddAgI/AAAAAAAADgw/KkCMa34ghmU/s320/Screen+Shot+2554-09-24+at+8.59.05+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;แอบเอาโค๊ดมาจาก&lt;a href="http://blog.devedup.com/index.php/2010/03/03/iphone-animate-an-object-along-a-path/"&gt;ที่นี่&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1344527968742427154?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1344527968742427154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/09/uiview.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1344527968742427154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1344527968742427154'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/09/uiview.html' title='สั่งให้ UIView เคลื่อนที่แนวโค้ง'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-RgEcBb09u0g/Tn31wX0z9uI/AAAAAAAADgs/LDAOfoG03HI/s72-c/Screen+Shot+2554-09-24+at+10.21.17+PM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-5336548677382312582</id><published>2011-09-21T18:11:00.000+07:00</published><updated>2011-09-21T18:11:40.910+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='how'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใส่รูปเป็น Background ให้ UINavigationBar</title><content type='html'>ในเมื่อ &lt;a href="http://developer.apple.com/library/IOS/#documentation/UIKit/Reference/UINavigationBar_Class/Reference/UINavigationBar.html"&gt;UINavigationBar&lt;/a&gt; มันทำงานไม่ถูกใจเรา ดังนั้นเราก็สร้าง &lt;a href="http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/objectivec/Chapters/ocCategories.html"&gt;Category&lt;/a&gt; ให้ UINavigationBar ใหม่ แบบนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #be299d;"&gt;@implementation&lt;/span&gt; UINavigationBar (UINavigationBarCategory)&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #be299d;"&gt;void&lt;/span&gt;)drawRect:(&lt;span style="color: #733ea4;"&gt;CGRect&lt;/span&gt;)rect {&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #733ea4;"&gt;UIColor&lt;/span&gt; *color = [&lt;span style="color: #733ea4;"&gt;UIColor&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;orangeColor&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #733ea4;"&gt;UIImage&lt;/span&gt; *img&amp;nbsp; = [&lt;span style="color: #733ea4;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;imageNamed&lt;/span&gt;: &lt;span style="color: #d42722;"&gt;@"nav_bar.png"&lt;/span&gt;];&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [img &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;drawInRect&lt;/span&gt;&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #401f7d;"&gt;CGRectMake&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;frame&lt;span style="color: black;"&gt;.&lt;/span&gt;size&lt;span style="color: black;"&gt;.&lt;/span&gt;width&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;frame&lt;span style="color: black;"&gt;.&lt;/span&gt;size&lt;span style="color: black;"&gt;.&lt;/span&gt;height&lt;span style="color: black;"&gt;)];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #be299d;"&gt;self&lt;/span&gt;.&lt;span style="color: #733ea4;"&gt;tintColor&lt;/span&gt; = color;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #be299d;"&gt;super&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;drawRect&lt;/span&gt;: rect];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #be299d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;@end&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"&gt;override method&amp;nbsp;&lt;span class="Apple-style-span" style="color: #733ea4; font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: #401f7d;"&gt;drawInRect&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #733ea4; font-family: Menlo; font-size: 14px;"&gt;&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;/span&gt;&amp;nbsp;ให้มันวาดรูปที่เราต้องการลงไปแทน และกำหนดสีให้ property&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #733ea4; font-family: Menlo; font-size: 14px;"&gt;tintColor&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&amp;nbsp;เพื่อให้ปุ่ม back ใน Navigation bar มีสีเข้ากับรูปที่เราวาดลงไปเป็น background&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ปัญหาจะตามมาอีกนิดนึงคือ title ที่อยู่บน Navigation bar อาจมีสีไม่เหมาะสมกับรูปที่เราวาดลงไปเป็น background วิธีแก้ไขก็คือเราจำเป็นต้องไปกำหนดสี และฟอนต์เอง ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #733ea4;"&gt;CGRect&lt;/span&gt; frame = &lt;span style="color: #401f7d;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;200&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;44&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #733ea4;"&gt;UILabel&lt;/span&gt; *label = [[[&lt;span style="color: #733ea4;"&gt;UILabel&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #401f7d;"&gt;initWithFrame&lt;/span&gt;:frame] &lt;span style="color: #401f7d;"&gt;autorelease&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;clearColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;span style="color: #733ea4;"&gt;font&lt;/span&gt; = [&lt;span style="color: #733ea4;"&gt;UIFont&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;systemFontOfSize&lt;/span&gt;:&lt;span style="color: #2f2fd1;"&gt;18&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;textAlignment&lt;/span&gt;&lt;span style="color: black;"&gt; = &lt;/span&gt;UITextAlignmentCenter&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;span style="color: #733ea4;"&gt;textColor&lt;/span&gt; = [&lt;span style="color: #733ea4;"&gt;UIColor&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;blackColor&lt;/span&gt;];&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;navigationItem&lt;span style="color: black;"&gt;.&lt;/span&gt;titleView&lt;span style="color: black;"&gt; = label;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;span style="color: #733ea4;"&gt;text&lt;/span&gt; = &lt;span style="color: #d42722;"&gt;@"First View"&lt;/span&gt;;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เท่านี้เราก็จะได้ UINavigationBar หน้าตาดังรูปนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-Vb0un9-PQKo/TnnFdyqiiJI/AAAAAAAADgo/EmPyR397U5c/s1600/Screen+Shot+2554-09-21+at+5.45.13+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-Vb0un9-PQKo/TnnFdyqiiJI/AAAAAAAADgo/EmPyR397U5c/s1600/Screen+Shot+2554-09-21+at+5.45.13+PM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-5336548677382312582?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/5336548677382312582/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/09/background-uinavigationbar.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5336548677382312582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5336548677382312582'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/09/background-uinavigationbar.html' title='ใส่รูปเป็น Background ให้ UINavigationBar'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-Vb0un9-PQKo/TnnFdyqiiJI/AAAAAAAADgo/EmPyR397U5c/s72-c/Screen+Shot+2554-09-21+at+5.45.13+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2681253097668277367</id><published>2011-09-10T21:16:00.001+07:00</published><updated>2011-09-10T21:31:27.530+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>กำหนดขนาดให้ UILabel มีขนาดพอดีกับข้อความ</title><content type='html'>Developer หลายคนมักเคยเจอปัญหาในเรื่องของการกำหนดข้อความยาวๆ ให้กับ UILabel แล้วก็ไม่รู้ว่าจะต้องกำหนดขนาดให้ UILabel เป็นเท่าไหร่ดี? เนื่องจาก UILabel นั้นมันไม่ยอมขยายขนาดให้ฟิตพอดีกับปริมาณของข้อความ หรือ text ที่เราจะเอามากำหนดค่าให้มัน&lt;br /&gt;&lt;br /&gt;จริงๆ แล้วที่เห็นปัญหาได้ชัดเจนกว่า UILabel ก็คือการกำหนดขนาดให้กับ Cell ในตารางของ UITableView ที่เรามักจะน้ำข้อมูลมาใส่ในตาราง และแต่ละ cell ของตารางก็บังเอิญมีขนาดเท่าๆ กันหมดด้วยสิ ทำให้การหาขนาดความสูงของ cell ให้มีขนาดเหมาะสมกับ content ที่จะวางลงไปในตารางจึงเป็นเรืองที่หลีกเลี่ยงแทบไม่ได้เลย&lt;br /&gt;&lt;br /&gt;ดังนั้นเราจำเป็นต้องกำหนดขนาดให้กับ UILabel ให้พอดีกับปริมาณข้อความเอง ซึ่งวิธีหาขนาดที่เหมาะสมให้กับ UILabel สามารถหาได้ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;CGSize&lt;/span&gt; size = [label.&lt;span style="color: #733ea4;"&gt;text&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;sizeWithFont&lt;/span&gt;: label.&lt;span style="color: #733ea4;"&gt;font&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;constrainedToSize&lt;/span&gt;: &lt;span style="color: #401f7d;"&gt;CGSizeMake&lt;/span&gt;(&lt;span style="color: #2f2fd1;"&gt;300&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;5000&lt;/span&gt;)&amp;nbsp;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;lineBreakMode&lt;span style="color: black;"&gt;: &lt;/span&gt;UILineBreakModeWordWrap&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ถ้าโค๊ดเต็มๆ สำหรับนำไปใช้งานก็จะมีหน้าตาประมาณนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #733ea4;"&gt;UILabel&lt;/span&gt; *label = [[&lt;span style="color: #733ea4;"&gt;UILabel&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #401f7d;"&gt;init&lt;/span&gt;];&lt;/div&gt;&lt;div style="color: #d42722; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;text&lt;/span&gt;&lt;span style="color: black;"&gt; = &lt;/span&gt;@"It is a long established fact that a reader will be distracted by the readable content of a page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like)."&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;span style="color: #733ea4;"&gt;numberOfLines&lt;/span&gt; = &lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #733ea4; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;whiteColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;span style="color: #733ea4;"&gt;font&lt;/span&gt; = [&lt;span style="color: #733ea4;"&gt;UIFont&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;fontWithName&lt;/span&gt;:&lt;span style="color: #d42722;"&gt;@"Helvetica"&lt;/span&gt;&lt;span style="color: #401f7d;"&gt;size&lt;/span&gt;:&lt;span style="color: #2f2fd1;"&gt;14&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #733ea4;"&gt;CGSize&lt;/span&gt; size = [label.&lt;span style="color: #733ea4;"&gt;text&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;sizeWithFont&lt;/span&gt;: label.&lt;span style="color: #733ea4;"&gt;font&lt;/span&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;constrainedToSize&lt;/span&gt;: &lt;span style="color: #401f7d;"&gt;CGSizeMake&lt;/span&gt;(&lt;span style="color: #2f2fd1;"&gt;300&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;5000&lt;/span&gt;)&amp;nbsp;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;lineBreakMode&lt;span style="color: black;"&gt;: &lt;/span&gt;UILineBreakModeWordWrap&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; label.&lt;span style="color: #733ea4;"&gt;frame&lt;/span&gt; = &lt;span style="color: #401f7d;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #2f2fd1;"&gt;10&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;10&lt;/span&gt;, &lt;span style="color: #2f2fd1;"&gt;300&lt;/span&gt;, size.&lt;span style="color: #733ea4;"&gt;height&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; [&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;.&lt;span style="color: #733ea4;"&gt;view&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;addSubview&lt;/span&gt;:label];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; [label &lt;span style="color: #401f7d;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เท่านี้เราก็จะได้ UILabel ที่มีขนาดเปลี่ยนไปตามปริมาณของข้อความแล้ว&lt;br /&gt;&lt;br /&gt;ปล. text ตัวอย่างเอามาจาก&lt;a href="http://www.lipsum.com/"&gt;เว็บนี้&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2681253097668277367?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2681253097668277367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/09/uilabel.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2681253097668277367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2681253097668277367'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/09/uilabel.html' title='กำหนดขนาดให้ UILabel มีขนาดพอดีกับข้อความ'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2228720024937530617</id><published>2011-09-10T18:36:00.000+07:00</published><updated>2011-09-10T18:36:07.379+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>เพ่ิมฟอนต์ให้ iOS</title><content type='html'>นอกจากฟอนต์ที่มีให้ใช้อยู่แล้ว เราสามารถเพิ่ม font ที่เราต้องการลงไปได้โดยมีขั้นตอนดังนี้&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;import ฟอนต์ที่ต้องการเข้ามาในโปรเจ็ค&lt;/li&gt;&lt;li&gt;เพิ่มค่า property ลงในไฟล์ info.plist โดยให้เพิ่มลงใน key ที่ชื่อ&amp;nbsp;UIAppFonts (ถ้าไม่มีให้สร้างใหม่) ซึ่งค่านี้จะมีชนิด value เป็น Array จากนั้นกำหนดชื่อฟอนต์ที่ต้องการ (ใส่นามสกุลด้วย เช่น .ttf)&lt;/li&gt;&lt;li&gt;เอาไปใช้ได้เลย โอยอ้างอิงเช่นเดียวกับ iOS system font ตามปกติ&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #733ea4;"&gt;UIFont&lt;/span&gt; *font = [&lt;span style="color: #733ea4;"&gt;UIFont&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;fontWithName&lt;/span&gt;: &lt;span style="color: #d42722;"&gt;@"TH Charmonman"&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;size&lt;/span&gt;: &lt;span style="color: #2f2fd1;"&gt;60&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #4d8186;"&gt;_textLabel&lt;/span&gt;.&lt;span style="color: #733ea4;"&gt;font&lt;/span&gt; = font;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;หน้าตาออกมาก็จะเป็นแบบนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-OGu61M2-PaE/TmtKblDgtyI/AAAAAAAADgk/38d3iuwY99Q/s1600/Screen+Shot+2554-09-10+at+6.12.28+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="266" src="http://4.bp.blogspot.com/-OGu61M2-PaE/TmtKblDgtyI/AAAAAAAADgk/38d3iuwY99Q/s400/Screen+Shot+2554-09-10+at+6.12.28+PM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ปล. จากตัวอย่างใช้ฟอนต์ชื่อ TH Charmonman เป็น 13 ฟอนต์เทพแห่งชาติ สามารถดาวน์โหลดได้จากเว็บของ &lt;a href="http://www.sipa.or.th/ewt_news.php?nid=481&amp;amp;filename=index"&gt;SIPA&lt;/a&gt; เลย หรือจะลองดูหน้าตาของฟอนต์ต่างๆ ก่อนตัดสินใจดาวน์โหลดก่อนได้&lt;a href="http://www.f0nt.com/release/13-free-fonts-from-sipa/"&gt;ที่นี่&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;แถม: &lt;a href="http://iosfonts.com/"&gt;iOS Fonts&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2228720024937530617?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2228720024937530617/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/09/ios.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2228720024937530617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2228720024937530617'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/09/ios.html' title='เพ่ิมฟอนต์ให้ iOS'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-OGu61M2-PaE/TmtKblDgtyI/AAAAAAAADgk/38d3iuwY99Q/s72-c/Screen+Shot+2554-09-10+at+6.12.28+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-5104475936410450727</id><published>2011-09-06T00:27:00.002+07:00</published><updated>2011-09-06T01:12:02.754+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><title type='text'>GeekTool ลง Mac App Store แล้ว</title><content type='html'>ในที่สุด &lt;a href="http://itunes.apple.com/us/app/geektool/id456877552?mt=12"&gt;GeekTool ก็ลง Mac App Store แล้ว&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;แต่เดิมผมไม่ได้สนใจมันเท่าไหร่ แต่ไหนๆ มันก็ลง Mac App Store แล้วก็เลยเอามาเล่นสักหน่อย ทำแบบรีบๆ ได้ Desktop หน้าตาแบบนี้มาดูเล่นล่ะ&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-NQIDyU7pMNg/TmUPc1qvMqI/AAAAAAAADgc/6F8rsgfCw2w/s1600/Screen+Shot+2554-09-06+at+1.03.14+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="250" src="http://2.bp.blogspot.com/-NQIDyU7pMNg/TmUPc1qvMqI/AAAAAAAADgc/6F8rsgfCw2w/s400/Screen+Shot+2554-09-06+at+1.03.14+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;หลักๆ แล้วการใช้ GeekTool จะเป็นการเอารูป และ output ของการรัน command ต่างๆ มาแปะไว้บน Desktop ที่นิยมก็เช่น วันที่ เวลา ปฏิทิน การใช้เมมโมรี่ และสถานะ CPU เป็นต้น&lt;br /&gt;&lt;br /&gt;สำหรับการนำรูปมาแปะสามารถเลือกรูปในเครื่องเราได้เลย และสามารถตั้งค่าให้มันเปลี่ยนรูปไปเรื่อยๆ ได้&lt;br /&gt;&lt;br /&gt;ยกตัวอย่างเช่นรูปรายงานสภาพอากาศนั้นผมไปดึงรูปมาจาก Yahoo Weather โดยมีขั้นตอนดังนี้&lt;br /&gt;&lt;br /&gt;1. ไป &lt;a href="http://weather.yahoo.com/"&gt;Yahoo Weather&lt;/a&gt; แล้วกำหนดสถานที่เป็น Bangkok Thailand จะได้ &lt;a href="http://weather.yahoo.com/thailand/bangkok/bangkok-1225448/?unit=c"&gt;URL มาของสภาพอากาศ&lt;/a&gt;มา&lt;br /&gt;2. เปิด GeekTool แล้วแปะ Shell ลงไป จากนั้นตรงช่อง command ให้ใส่คำสั่งดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: #274e13; font-family: Verdana, sans-serif; font-size: small;"&gt;curl --silent "&lt;i&gt;WEATHER_URL&lt;/i&gt;" | grep "forecast-icon" | sed "s/.*background\\:url(\\'\\(.*\\)\\')\\;\\ _background.*/\\1/" | xargs curl --silent -o /tmp/wpicture.png&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;ให้แทน &lt;i&gt;WEATHER_URL&lt;/i&gt; ด้วย url ของสภาพอากาศที่ได้มา&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;จากคำสั่งจะเป็นการดึง HTML จาก URL ของสภาพอากาศที่ได้มาจากนั้นแกะเอาแต่ชื่อภาพของสภาพอากาศและสั่งเซฟลงไปที่ /tmp/wpicture.png&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;และให้กำหนดให้มัน refresh ทุกๆ เวลาเท่าไหร่ก็ได้ อาจจะสัก 1 ชั่วโมงต่อครั้ง (การสั่ง refresh ที่ว่านี้จะเป็นการกำหนดให้คำนั่งที่เรากำหนดไว้ทำงานทุกๆ เวลากี่วินาที)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;3. ไปที่ GeekTool แล้วแปะ Image ลงไป ตรงค่า URL ของรูปนั้นให้ใส่เป็น&amp;nbsp;file:///tmp/wpicture.png พร้อมทั้งกำหนดให้มัน refresh รูปด้วย (ประมาณ 1 ชม. ต่อครั้งก็ได้)&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;เท่านี้รูปสภาพอากาศก็จะเปลี่ยนแปลงไปเรื่อยๆ แล้ว&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;4. สำหรับอุณหภูมิและสภาพอากาศนั้นให้ใช้คำสั่งดังนี้&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #274e13; font-family: Verdana, sans-serif; font-size: small;"&gt;curl --silent "http://xml.weather.yahoo.com/forecastrss?p=THXX0002&amp;amp;u=c" | grep -E '(Current Conditions:|C&amp;lt;BR)' | sed -e 's/Current Conditions://' -e 's/&amp;lt;br \/&amp;gt;//' -e 's/&amp;lt;b&amp;gt;//' -e 's/&amp;lt;\/b&amp;gt;//' -e 's/&amp;lt;BR \/&amp;gt;//' -e 's/&amp;lt;description&amp;gt;//' -e 's/&amp;lt;\/description&amp;gt;//' -e 's/,//' | tail -n1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;แทนพารามิเตอร์ p ด้วยรหัสของสถานที่ที่เราต้องการ ดูได้จาก RSS ในหน้าสภาพอากาศนั่นแหละ&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;เช่น หากกำหนดสภาพอากาศเป็น Bangkok แล้วกดดู RSS จะได้&lt;a href="feed://weather.yahooapis.com/forecastrss?p=THXX0002&amp;amp;u=c"&gt;แบบนี้&lt;/a&gt; และค่า p คือ THXX0002 นั่นเอง&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;ตัวอย่าง Desktop สวยๆ ที่เอา GeekTool ไปใช้:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;a href="http://desktopspotting.com/25/awesome-geektool-mac-os-x-desktop/"&gt;http://desktopspotting.com/25/awesome-geektool-mac-os-x-desktop/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;a href="http://tjdyo.deviantart.com/art/My-Desktop-with-Geektool-195121469"&gt;http://tjdyo.deviantart.com/art/My-Desktop-with-Geektool-195121469&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;a href="http://www.fuelyourinterface.com/making-your-desktop-look-awesome-again/"&gt;http://www.fuelyourinterface.com/making-your-desktop-look-awesome-again/&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;a href="http://www.stumbleupon.com/su/2NzrKf/smokingapples.com/software/15-geektool-desktop-inspirations-for-the-weekend"&gt;http://www.stumbleupon.com/su/2NzrKf/smokingapples.com/software/15-geektool-desktop-inspirations-for-the-weekend&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;และอันนี้เซ็ตใหญ่จาก flickr ครับ&amp;nbsp;&lt;a href="http://www.flickr.com/photos/tags/geektool/interesting/"&gt;http://www.flickr.com/photos/tags/geektool/interesting/&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 17.0px Helvetica; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;:)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-5104475936410450727?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/5104475936410450727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/09/geektool-mac-app-store.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5104475936410450727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5104475936410450727'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/09/geektool-mac-app-store.html' title='GeekTool ลง Mac App Store แล้ว'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-NQIDyU7pMNg/TmUPc1qvMqI/AAAAAAAADgc/6F8rsgfCw2w/s72-c/Screen+Shot+2554-09-06+at+1.03.14+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-5835951098708878780</id><published>2011-09-02T02:54:00.001+07:00</published><updated>2011-09-02T02:54:28.668+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><title type='text'>ใช้ Mail.app ใน Lion แล้วส่งเมลล์ออกไม่ได้</title><content type='html'>พยายามส่ง e-mail โดยใช้โปรแกรม Mail.app ที่ติดมากับ Mac OS X Lion อยู่หลายที ไม่เคยจะส่งออกได้สักที ลอง google ดูพบว่าแทบทุกที่ให้ทำตามนี้กันหมดเลย แล้วมันจะทำให้เราส่ง e-mail ได้!&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Quit mail.app&lt;/li&gt;&lt;li&gt;Go to &lt;a href="https://www.google.com/accounts/DisplayUnlockCaptcha"&gt;https://www.google.com/accounts/DisplayUnlockCaptcha&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Unlock the captcha&lt;/li&gt;&lt;li&gt;Launch mail&lt;/li&gt;&lt;li&gt;Done!&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-5835951098708878780?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/5835951098708878780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/09/mailapp-lion.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5835951098708878780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5835951098708878780'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/09/mailapp-lion.html' title='ใช้ Mail.app ใน Lion แล้วส่งเมลล์ออกไม่ได้'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-7024891580270984126</id><published>2011-08-31T05:50:00.000+07:00</published><updated>2011-08-31T05:50:16.329+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>สร้าง Object จากชื่อคลาส</title><content type='html'>เราสามารถสร้าง Object แบบกำหนดชื่อคลาสได้ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #be299d;"&gt;id&lt;/span&gt;&lt;span style="color: black;"&gt; *object = [[&lt;/span&gt;NSClassFromString&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #d42722;"&gt;@"MyClassName"&lt;/span&gt;&lt;span style="color: black;"&gt;) &lt;/span&gt;alloc&lt;span style="color: black;"&gt;] &lt;/span&gt;init&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-family: Times, 'Times New Roman', serif; font-size: small;"&gt;ประโยชน์ก็คือในบางกรณีเราไม่สามารถรู้ได้ตั้งแต่ตอนเขียนโปรแกรมว่าจังหวะนี้ควรจะโหลด Object ของคลาสไหน จนกว่าจะถึงตอนที่ต้องใช้จริงๆ&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-7024891580270984126?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/7024891580270984126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/08/object.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/7024891580270984126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/7024891580270984126'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/08/object.html' title='สร้าง Object จากชื่อคลาส'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-7282589661824899441</id><published>2011-08-29T11:34:00.003+07:00</published><updated>2011-08-29T11:37:11.406+07:00</updated><title type='text'>บังคับให้ UI Orientation เปลี่ยน</title><content type='html'>เราสามารถบังคับให้ User Interface Orientation ใน iOS Device เปลี่ยนได้&lt;br /&gt;&lt;div&gt;ยกตัวอย่างการ toggle ไปมาระหว่ง UI แนวตั้งกับแนวนอน สามารถทำได้ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #79482e; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #be299d;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;UIInterfaceOrientationIsPortrait&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;.interfaceOrientation)){&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [[&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;UIDevice&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;currentDevice&lt;span style="color: black;"&gt;] &lt;/span&gt;setOrientation&lt;span style="color: black;"&gt;:&lt;/span&gt;UIInterfaceOrientationLandscapeRight&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;span style="color: #be299d;"&gt;else&lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [[&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;UIDevice&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;currentDevice&lt;span style="color: black;"&gt;] &lt;/span&gt;setOrientation&lt;span style="color: black;"&gt;:&lt;/span&gt;UIInterfaceOrientationPortrait&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-7282589661824899441?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/7282589661824899441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/08/ui-orientation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/7282589661824899441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/7282589661824899441'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/08/ui-orientation.html' title='บังคับให้ UI Orientation เปลี่ยน'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-8833530538387482328</id><published>2011-08-24T12:08:00.000+07:00</published><updated>2011-08-24T12:08:06.020+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Exception กับ @try, @catch และ @finally</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;ผมไม่ค่อยเห็นใครใช้การดักจับ Exception โดย try...catch บล็อคสักเท่าไหร่ในการเขียนโปรแกรมด้วยภาษา Objective-C เท่าที่เห็นจะเป็นการโยน NSError เข้าไป และอ้างถึงมันในภายหลัง หรือไม่ก็มี delegate message back กลับมาบอกว่ามันมีการทำงานผิดพลาดอย่างไร&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;ในภาษา Object-C การดักจับ Exception ให้ทำดังนี้&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #008423;"&gt;// 1 สร้าง Array เปล่าๆ ขึ้นมาก่อน&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #733ea4;"&gt;NSArray&lt;/span&gt; *array = [[&lt;span style="color: #733ea4;"&gt;NSArray&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #401f7d;"&gt;init&lt;/span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #be299d;"&gt;@try&lt;/span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #008423;"&gt;// 2 อ้างถึง element ใน Array ที่ไม่ได้มีอยู่จริง&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;(&lt;span style="color: #d42722;"&gt;@"object = %@"&lt;/span&gt;, [array &lt;span style="color: #401f7d;"&gt;objectAtIndex&lt;/span&gt;: &lt;span style="color: #2f2fd1;"&gt;0&lt;/span&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;span style="color: #be299d;"&gt;@catch&lt;/span&gt; (NSException *exception) {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #008423;"&gt;// เมื่อเกิดข้อผิดพลาดขึ้นโค๊ดข้างในนี้จะถูกเรียกให้ทำงาน&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;(&lt;span style="color: #d42722;"&gt;@"Exception name = %@"&lt;/span&gt;, exception.&lt;span style="color: #733ea4;"&gt;name&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d42722; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;@"Exception reason = %@"&lt;span style="color: black;"&gt;, exception.&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;reason&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #be299d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;@finally&lt;span style="color: black;"&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #be299d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black; font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #008423;"&gt;// โค๊ดในบล็อคนี้จะถูกเรียกให้ทำงานเสมอ&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;(&lt;span style="color: #d42722;"&gt;@"finally"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [array &lt;span style="color: #401f7d;"&gt;release&lt;/span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;จากโค๊ด เป็นการยกตัวอย่างการเข้าถึง Element ใน Array ที่ไม่มีอยู่จริง โดยเริ่มจากสร้าง Array เปล่าๆ ขึ้นมาก่อน จากนั้นในจุดที่ 2 จะพยายามอ้างถึง Element ที่ 0 ของ Array ที่สร้างขึ้นมา ซึ่งไม่ได้มีอยู่จริง และทำให้เกิดข้อผิดพลาดเกิดขึ้น เมื่อใดก็ตามที่โค๊ดในบล็อค&amp;nbsp;&lt;span class="Apple-style-span" style="color: #be299d; font-size: 14px;"&gt;@try&amp;nbsp;&lt;/span&gt;เกิดข้อผิดพลาดขึ้น มันจะหยุดทำงานทันทีและโค๊ดในบล็อค&amp;nbsp;&lt;span class="Apple-style-span" style="color: #be299d; font-size: 14px;"&gt;@catch&amp;nbsp;&lt;/span&gt;จะเริ่มทำงานต่อ ส่วน&amp;nbsp;&lt;span class="Apple-style-span" style="color: #be299d; font-size: 14px;"&gt;@finally&amp;nbsp;&lt;/span&gt;นั้นจะทำงานเสมอไม่ว่าจะเกิด Exception ขึ้นหรือไม่ก็ตาม&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;ส่วนผลลัพธ์ที่ได้จะเป็นดังนี้&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Exception name = NSRangeException&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Exception reason = *** -[NSArray objectAtIndex:]: index 0 beyond bounds for empty array&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;finally&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;การโยน Exception ออกจามาจาก function ที่เรียกใช้&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;- (&lt;span style="color: #be299d;"&gt;void&lt;/span&gt;) testException{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #be299d;"&gt;if&lt;/span&gt;(&lt;span style="color: #be299d;"&gt;YES&lt;/span&gt;){&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;/div&gt;&lt;div style="color: #008423; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #008423;"&gt;// สร้าง Exception และโยนมันออกไปจากตรงนี้&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #733ea4;"&gt;NSException&lt;/span&gt; *exception = [&lt;span style="color: #733ea4;"&gt;NSException&lt;/span&gt; &lt;span style="color: #401f7d;"&gt;exceptionWithName&lt;/span&gt;: &lt;span style="color: #d42722;"&gt;@"Exception"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;reason&lt;/span&gt;: &lt;span style="color: #d42722;"&gt;@"There are someting wrong"&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;userInfo&lt;/span&gt;: &lt;span style="color: #be299d;"&gt;nil&lt;/span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #be299d;"&gt;@throw&lt;/span&gt; exception;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;เมื่อมีการใช้งาน method&amp;nbsp;&lt;span class="Apple-style-span" style="font-size: 14px;"&gt;- (&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 14px;"&gt;&lt;span style="color: #be299d;"&gt;void&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 14px;"&gt;) testException&lt;/span&gt;&amp;nbsp; และเกิดข้อผิดพลาดขึ้น เราสามารถโยน Exception ออกจาก function ได้ตามโค๊ดด้านบน&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;ลองเอา function ที่จะมีการ throw exception ออกมามาใช้งานใน @try บล็อค&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="color: #be299d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;@try&lt;span style="color: black;"&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #401f7d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style="color: #be299d;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;testException&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;span style="color: #be299d;"&gt;@catch&lt;/span&gt; (NSException *exception) {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;(&lt;span style="color: #d42722;"&gt;@"Exception name = %@"&lt;/span&gt;, exception.&lt;span style="color: #733ea4;"&gt;name&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d42722; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;@"Exception reason = %@"&lt;span style="color: black;"&gt;, exception.&lt;/span&gt;&lt;span style="color: #733ea4;"&gt;reason&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 16.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #be299d; font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;@finally&lt;span style="color: black;"&gt; {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #401f7d;"&gt;NSLog&lt;/span&gt;(&lt;span style="color: #d42722;"&gt;@"finally"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [array &lt;span style="color: #401f7d;"&gt;release&lt;/span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 14.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif; font-size: small;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จากนั้นลองรันโปรแกรมดูใหม่ ผลจะออกมาดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Exception name = Exception&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;Exception reason = There are someting wrong&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;b&gt;finally&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;:)&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-8833530538387482328?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/8833530538387482328/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2011/08/exception-try-catch-finally.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8833530538387482328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8833530538387482328'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2011/08/exception-try-catch-finally.html' title='Exception กับ @try, @catch และ @finally'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-5242179698781529302</id><published>2010-12-30T09:46:00.000+07:00</published><updated>2010-12-30T09:46:45.062+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><title type='text'>เดินทางจากกรุงเทพฯ มาพะเยากับ truemove</title><content type='html'>&lt;div class="rotilinks"&gt;เดินทางไปภาคเหนือคราวนี้ผมเปิดโปรแกรม track เส้นทางตลอด และเปิด cellular data ตลอดทางไปกับสัญญาณของ truemove อันโด่งดัง เพื่อเทียบกับปีก่อนๆ&lt;br /&gt;&lt;br /&gt;ผลที่ออกมาก็คือสัญญาณ truemove ดีขึ้นกว่าที่เคยรู้สึกมาก ไม่รู้ว่าคิดไปเองไหม หรือว่าเป็นแบบนี้มาตั้งแต่ต้นอยู่แล้ว แต่รวมๆแล้ว ถือว่าพอใจมากกับสัญญาณเน็ตที่ไปด้วยกันแทบจะตลอดเส้นทาง มีบางที่เท่านั้น ที่ไม่มีสัญญาณ แต่ก็ถือว่าน้อยมากๆ&lt;br /&gt;&lt;br /&gt;แผนที่ด้านล่างแสดงเส้นทางที่ผมใช้เดินทางขึ้นไปภาคเหนือ และจุดที่แหว่งๆ หายๆ ก็คือจุดที่ไม่มีสัญญาณ truemove นั่นเอง! (1 จุดที่กระโดดไปแถวๆ เชียงราย กับ 1 จุดข้างล่างเชียงคำ นั้น gps + โปรแกรม มันทำงานผิดพลาดเอง)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TRvs2E3JBYI/AAAAAAAADb8/MCDPnXiIARA/s1600/travel+path.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TRvs2E3JBYI/AAAAAAAADb8/MCDPnXiIARA/s1600/travel+path.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;มี 2 จุดใหญ่ๆ ที่เป็นปัญหากับสัญญาณ truemove มาก จุดแรกคือจุดที่เริ่มตั้งแต่ทางแยกระหว่างทางไป อ. งาว และ อ. สอง ดังรูปข้างล่าง (ถ้าดูรูปด้านบนจะเห็นว่าเป็นช่วงที่เว้นไปเยอะพอสมควร)&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TRvtMaKPxFI/AAAAAAAADcA/vDUSasHpTjI/s1600/2_ways.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TRvtMaKPxFI/AAAAAAAADcA/vDUSasHpTjI/s1600/2_ways.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;หลังจากเข้าทางแยกมาแล้ว พบว่าไม่มีสัญญาณ truemove ตลอดทางเลย และนานมากๆ กว่าจะมีสัญญาณอีกที และก็เป็นจุดนี้ทุกๆ ที ทุกๆ ปีที่ผ่านมา เป็นจุดที่ truemove อ่อนแอ ไม่รู้ว่าทาง true เค้าจะรู้ไหม&lt;br /&gt;&lt;br /&gt;ส่วนจุดที่สองที่สัญญาณ truemove อ่อนแอมากๆ ก็คือที่หมู่บ้านผมเอง เป็นแบบนี้มาหลายปีแล้ว เข้ามาใกล้ๆ หมู่บ้านทีไร สัญญาณ truemove ก็หายวับดับไปทันทีทุกที&lt;br /&gt;&lt;br /&gt;ผมพยายามจะใช้ truemove ให้ตลอดรอดฝั่ง แต่จนแล้วจนรอดก็ต้องพึ่งซิมของ AIS อยู่ดีสิน่า&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-5242179698781529302?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/5242179698781529302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/12/truemove.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5242179698781529302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5242179698781529302'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/12/truemove.html' title='เดินทางจากกรุงเทพฯ มาพะเยากับ truemove'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3fuqAEHAG_Q/TRvs2E3JBYI/AAAAAAAADb8/MCDPnXiIARA/s72-c/travel+path.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-189389805063767405</id><published>2010-10-29T15:39:00.001+07:00</published><updated>2010-10-29T15:42:12.260+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><title type='text'>เล่น YouTube clip ที่ embed ใน UIWebView ทันทีที่ UIWebView โหลดเสร็จ</title><content type='html'>&lt;div class="rotilinks"&gt;หากเรานำ Embed code จาก Youtube มาเปิดด้วย &lt;a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html"&gt;UIWebView&lt;/a&gt; แล้วจะพบว่า Video จะไม่เล่นเลยทันทีที่ UIWebView โหลดเสร็จ ทำให้เราต้องกดปุ่ม Play ที่ overlay อยู่บน clip ก่อนถึงจะเล่นได้&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;สำหรับการทำให้มันดูเหมือนเล่นทันทีอัตโนมัติหลังจาก UIWebView โหลดเสร็จแล้วเราจะใช้วิธีการส่ง&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3f217c; font-family: Menlo; font-size: 13px;"&gt;UIControlEventTouchUpInside&lt;/span&gt;&amp;nbsp;&amp;nbsp;ไปหาปุ่มที่เราต้องการกดเสมือนกับว่าเรากดเอง&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เราจะเริ่มหาปุ่มหลังจากที่ UIWebView โหลดเสร็จแล้ว ใน delegate method ตัวนี้ ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #bf2e9d;"&gt;void&lt;/span&gt;)webViewDidFinishLoad:(&lt;span style="color: #7340a3;"&gt;UIWebView&lt;/span&gt; *) webView {&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #7340a3;"&gt;UIButton&lt;/span&gt; *b = [&lt;span style="color: #bf2e9d;"&gt;self&lt;/span&gt; &lt;span style="color: #2e595d;"&gt;findButtonInView&lt;/span&gt;: webView];&lt;/div&gt;&lt;div style="color: #3f217c; font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [b &lt;/span&gt;sendActionsForControlEvents&lt;span style="color: black;"&gt;:&lt;/span&gt;UIControlEventTouchUpInside&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;และเขียน method&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 13px;"&gt;&lt;span style="color: #2e595d;"&gt;findButtonInView&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 13px;"&gt;:&lt;/span&gt;&amp;nbsp;ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #7340a3;"&gt;UIButton&lt;/span&gt; *)findButtonInView:(&lt;span style="color: #7340a3;"&gt;UIView&lt;/span&gt; *)&lt;span style="color: #7340a3;"&gt;view&lt;/span&gt; {&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #7340a3;"&gt;UIButton&lt;/span&gt; *button = &lt;span style="color: #bf2e9d;"&gt;nil&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3f217c; font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #bf2e9d;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; ([&lt;/span&gt;&lt;span style="color: #7340a3;"&gt;view&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;isMemberOfClass&lt;span style="color: black;"&gt;:[&lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UIButton&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;class&lt;span style="color: black;"&gt;]]) {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #bf2e9d;"&gt;return&lt;/span&gt; (&lt;span style="color: #7340a3;"&gt;UIButton&lt;/span&gt; *)&lt;span style="color: #7340a3;"&gt;view&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7340a3; font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #bf2e9d;"&gt;if&lt;/span&gt;&lt;span style="color: black;"&gt; (&lt;/span&gt;view&lt;span style="color: black;"&gt;.&lt;/span&gt;subviews&lt;span style="color: black;"&gt; &amp;amp;&amp;amp; [&lt;/span&gt;view&lt;span style="color: black;"&gt;.&lt;/span&gt;subviews&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #3f217c;"&gt;count&lt;/span&gt;&lt;span style="color: black;"&gt;] &amp;gt; &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #bf2e9d;"&gt;for&lt;/span&gt; (&lt;span style="color: #7340a3;"&gt;UIView&lt;/span&gt; *subview &lt;span style="color: #bf2e9d;"&gt;in&lt;/span&gt; &lt;span style="color: #7340a3;"&gt;view&lt;/span&gt;.&lt;span style="color: #7340a3;"&gt;subviews&lt;/span&gt;) {&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; button = [&lt;span style="color: #bf2e9d;"&gt;self&lt;/span&gt; &lt;span style="color: #2e595d;"&gt;findButtonInView&lt;/span&gt;:subview];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #bf2e9d;"&gt;if&lt;/span&gt; (button) &lt;span style="color: #bf2e9d;"&gt;return&lt;/span&gt; button;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #bf2e9d;"&gt;return&lt;/span&gt; button;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เท่านี้ก็เรียบร้อย&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-189389805063767405?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/189389805063767405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/10/youtube-uiwebview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/189389805063767405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/189389805063767405'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/10/youtube-uiwebview.html' title='เล่น YouTube clip ที่ embed ใน UIWebView ทันทีที่ UIWebView โหลดเสร็จ'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-710514956118696644</id><published>2010-10-19T08:50:00.000+07:00</published><updated>2010-10-19T08:50:37.915+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ตรวจสอบว่า Device กำลังต่อ 3G, Edge, Wifi อยู่หรือเปล่า</title><content type='html'>&lt;div class="rotilinks"&gt;ตรวจสอบว่า iPhone/iPad/iPod ต่ออินเทอร์เน็ตได้หรือเปล่ามีคนทำไว้ให้เรียบร้อยแล้ว วิธีใช้ง่ายมาก (ง่ายกว่า Reachability ที่อยู่บนเว็บของ Apple อีกนะ)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #bf2e9d;"&gt;if&lt;/span&gt; ([Connection isConnected]){&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;...&lt;/div&gt;&lt;div style="color: #bf2e9d; font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;}&lt;/span&gt;else&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;...&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ก่อนใช้งานอย่าลืม include framework ชื่อ SystemConfiguration กับ libz.1.1.3.dylib ด้วย&lt;br /&gt;&lt;br /&gt;ที่มา : &lt;a href="http://www.xprogress.com/post-40-iphone-internet-connection-check-wifi-3g-edge-something-like-reachability-h/"&gt;xprogress.com&lt;/a&gt;&lt;br /&gt;มีคนเอามาทำเป็นไฟล์ให้ download มาใช้ง่ายๆด้วย &lt;a href="http://www.applausible.com/blog/?p=100"&gt;ที่นี่&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-710514956118696644?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/710514956118696644/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/10/device-3g-edge-wifi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/710514956118696644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/710514956118696644'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/10/device-3g-edge-wifi.html' title='ตรวจสอบว่า Device กำลังต่อ 3G, Edge, Wifi อยู่หรือเปล่า'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2152356788931123030</id><published>2010-10-19T07:05:00.005+07:00</published><updated>2010-10-19T08:08:49.432+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Custom UISlider</title><content type='html'>&lt;div class="rotilinks"&gt;เราสามารถเปลี่ยนหน้าตาของ &lt;a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UISlider_Class/Reference/Reference.html"&gt;UISlider&lt;/a&gt;&amp;nbsp;ให้เข้ากับ UI ของ iOS Application ที่เรากำลังพัฒนาอยู่ได้ด้วยการกำหนดรูปภาพด้านซ้ายของปุ่มเลื่อน ขวาของปุ่มเลื่อน และปุ่มสำหรับเลื่อนให้มันผ่าน method 3 ตัวนี้&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;- (void)setMaximumTrackImage:(&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;a href="http://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIImage" style="color: #3366cc; text-decoration: none;"&gt;UIImage&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;*)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;image&lt;/em&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forState:(UIControlState)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;state&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;- (void)setMinimumTrackImage:(&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;a href="http://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIImage" style="color: #3366cc; text-decoration: none;"&gt;UIImage&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;*)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;image&lt;/em&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;forState:(UIControlState)&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;state&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-style: normal;"&gt;- (void)setThumbImage:(&lt;a href="http://developer.apple.com/library/ios/documentation/uikit/reference/UIImage_Class/Reference/Reference.html#//apple_ref/doc/c_ref/UIImage" style="color: #3366cc; text-decoration: none;"&gt;UIImage&lt;/a&gt;&amp;nbsp;*)&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;image&lt;/em&gt;&amp;nbsp;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-size: 13px;"&gt;&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-family: Courier, Consolas, monospace; font-style: normal;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; forState:(UIControlState)&lt;em style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 13px; font-style: italic;"&gt;state&lt;/em&gt;&lt;/span&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;เริ่มจากกำหนดรูปเหล่านี้ให้กับ UISlider&lt;br /&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzfT4oxn0I/AAAAAAAADbI/X7T12WDxQpY/s1600/min.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="3" src="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzfT4oxn0I/AAAAAAAADbI/X7T12WDxQpY/s320/min.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;min.png&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TLzfXgbg1HI/AAAAAAAADbM/cGcHZgJYj6A/s1600/max.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" height="3" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TLzfXgbg1HI/AAAAAAAADbM/cGcHZgJYj6A/s320/max.png" width="320" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;max.png&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TLzfa-D1T5I/AAAAAAAADbQ/XABnUh08LdQ/s1600/center.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TLzfa-D1T5I/AAAAAAAADbQ/XABnUh08LdQ/s1600/center.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;center.png&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UIImage&lt;/span&gt; *minImage = [&lt;span style="color: #7340a3;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #3f217c;"&gt;imageNamed&lt;/span&gt;: &lt;span style="color: #d62b24;"&gt;@"min.png"&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UIImage&lt;/span&gt; *maxImage = [&lt;span style="color: #7340a3;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #3f217c;"&gt;imageNamed&lt;/span&gt;: &lt;span style="color: #d62b24;"&gt;@"max.png"&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UIImage&lt;/span&gt; *center = [&lt;span style="color: #7340a3;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #3f217c;"&gt;imageNamed&lt;/span&gt;: &lt;span style="color: #d62b24;"&gt;@"center.png"&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3f217c; font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;minImage = [minImage &lt;/span&gt;stretchableImageWithLeftCapWidth&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;10.0&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #3f217c;"&gt;topCapHeight&lt;/span&gt;: &lt;span style="color: #2832cf;"&gt;0.0&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3f217c; font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;maxImage = [maxImage &lt;/span&gt;stretchableImageWithLeftCapWidth&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;10.0&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;span style="color: #3f217c;"&gt;topCapHeight&lt;/span&gt;: &lt;span style="color: #2832cf;"&gt;0.0&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UISlider&lt;/span&gt; *slider = [[&lt;span style="color: #7340a3;"&gt;UISlider&lt;/span&gt; &lt;span style="color: #3f217c;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #3f217c;"&gt;init&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slider &lt;span style="color: #3f217c;"&gt;setMinimumTrackImage&lt;/span&gt;: minImage&amp;nbsp;&lt;span class="Apple-style-span" style="color: #3f217c;"&gt;forState&lt;span style="color: black;"&gt;: &lt;/span&gt;UIControlStateNormal&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slider &lt;span style="color: #3f217c;"&gt;setMaximumTrackImage&lt;/span&gt;: maxImage&amp;nbsp;&lt;span class="Apple-style-span" style="color: #3f217c;"&gt;forState&lt;span style="color: black;"&gt;: &lt;/span&gt;UIControlStateNormal&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slider &lt;span style="color: #3f217c;"&gt;setThumbImage&lt;/span&gt;: center&amp;nbsp;&lt;span class="Apple-style-span" style="color: #3f217c;"&gt;forState&lt;span style="color: black;"&gt;: &lt;/span&gt;UIControlStateNormal&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;slider.&lt;span style="color: #7340a3;"&gt;frame&lt;/span&gt; = &lt;span style="color: #3f217c;"&gt;CGRectMake&lt;/span&gt;(&lt;span class="Apple-style-span" style="color: #2832cf;"&gt;0&lt;/span&gt;, &lt;span class="Apple-style-span" style="color: #2832cf;"&gt;480/2&lt;/span&gt;, &lt;span style="color: #2832cf;"&gt;300&lt;/span&gt;, &lt;span style="color: #2832cf;"&gt;44&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;span style="color: #bf2e9d;"&gt;self&lt;/span&gt;.&lt;span style="color: #7340a3;"&gt;view&lt;/span&gt; &lt;span style="color: #3f217c;"&gt;addSubview&lt;/span&gt;: slider];&lt;/div&gt;&lt;div style="font: 13.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[slider &lt;span style="color: #3f217c;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;จะได้ slider หน้าตาใหม่ออกมาแบบนี้ โดยด้านบนเป็น default UI ของ iOS เอง ส่วนด้านล่างเป็นแบบที่ทำขึ้นมาใหม่&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TLzfo_lv1rI/AAAAAAAADbU/2BttulCvdqo/s1600/Screen+shot+2010-10-19+at+6.50.03+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TLzfo_lv1rI/AAAAAAAADbU/2BttulCvdqo/s1600/Screen+shot+2010-10-19+at+6.50.03+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เท่านี้เราก็สามารถสร้าง UISlider ที่มี UI เป็นไปในทางเดียวกับ Application ของเราได้แล้ว&lt;br /&gt;&lt;br /&gt;&lt;a href="https://sites.google.com/site/blogspottank/download/TestSlider.zip?attredirects=0&amp;amp;d=1"&gt;ตัวอย่าง&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2152356788931123030?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2152356788931123030/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/10/custom-uislider.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2152356788931123030'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2152356788931123030'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/10/custom-uislider.html' title='Custom UISlider'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzfT4oxn0I/AAAAAAAADbI/X7T12WDxQpY/s72-c/min.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-4252087117050075108</id><published>2010-10-19T06:10:00.002+07:00</published><updated>2010-10-19T06:12:06.686+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใช้ Instrument tools ช่วยตามหา EXC_BAD_ACCESS</title><content type='html'>&lt;div class="rotilinks"&gt;&lt;a href="http://khomkrit.blogspot.com/2010/10/excbadaccess.html"&gt;Entry ที่แล้ว&lt;/a&gt;เป็นการตามหาว่าตรงไหนทำให้เกิด EXC_BAD_ACCESS เองจากข้อมูลเพียงน้อยนิดที่ log ออกมาทาง console แต่สำหรับครั้งนี้จะเป็นการใช้ &lt;a href="http://developer.apple.com/technologies/tools/"&gt;Instrument Tools&lt;/a&gt; ช่วยในการตามหาให้ ว่าจุดที่เป็นปัญหาอยู่ตรงไหน&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzS0viPOnI/AAAAAAAADbA/Eia3a6WV47g/s1600/Screen+shot+2010-10-19+at+6.05.29+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzS0viPOnI/AAAAAAAADbA/Eia3a6WV47g/s1600/Screen+shot+2010-10-19+at+6.05.29+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เริ่มจากสั่ง Run -&amp;gt; Run with Performance Tool -&amp;gt; Allocations&lt;br /&gt;หลังจาก &amp;nbsp;Instruments รันขึ้นมาแล้วให้กดหยุดการทำงานทันที (ปุ่มวงกลมมีจุดแดงตรงกลาง) จากนั้นให้กดปุ่ม i ทางด้านขวาของ Allocations จะเห็น popup ปรากฏขึ้นมา ให้เลือก  Record reference counts และ Enable NSZombie detection ดังรูป&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TLzPYGCiQfI/AAAAAAAADaw/ZlwknQ495jE/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="293" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TLzPYGCiQfI/AAAAAAAADaw/ZlwknQ495jE/s400/1.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จากนั้นกดปุ่ม Recrod เพื่อให้โปรแกรมทำงานต่ออีกครั้ง หากโปแกรมทำงานถึงจุดที่เกิด EXE_BAD_ACCESS เราจะเห็น popup ดังรูปด้านล่างแสดงขึ้นมา&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzQCIgVY5I/AAAAAAAADa0/EG3j9CFjjCs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="135" src="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzQCIgVY5I/AAAAAAAADa0/EG3j9CFjjCs/s400/2.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ปัญหาก็ตามที่ popup บอก :) ให้กดปุมลูกศรที่อยู่ท้ายข้อความใน popup โปรแกรมจะบอกตัวการที่ทำให้เกิด EXE_BAD_ACCESS (สังเกตว่า Reference counts จะเป็น -1) และด้าน Stack Track ด้านขวามือบอกจุดที่ทำให้เกิดปัญหา ดังรูปด้านล่าง&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TLzRqmKy_uI/AAAAAAAADa4/bVw-8uAgIEw/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="260" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TLzRqmKy_uI/AAAAAAAADa4/bVw-8uAgIEw/s400/3.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ให้ Instruments ชี้จุดผิดชัดๆ ได้โดยการ double click ที่จุดผิดใน Stack Track จะพบบรรทัดที่ทำให้ผิดได้เลยทันที ไม่ต้องไล่หาเองแบบครั้งที่แล้วแล้ว&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TLzSG7BYtHI/AAAAAAAADa8/4zS4DTnpdhU/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="244" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TLzSG7BYtHI/AAAAAAAADa8/4zS4DTnpdhU/s400/4.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ค้นพบว่ามีคนทำวีดีโอให้ดูวิธีทำกันตัวเป็นๆ &lt;a href="http://www.markj.net/iphone-memory-debug-nszombie/"&gt;ที่นี่&lt;/a&gt;ด้วย&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-4252087117050075108?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/4252087117050075108/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/10/instrument-tools-excbadaccess.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4252087117050075108'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4252087117050075108'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/10/instrument-tools-excbadaccess.html' title='ใช้ Instrument tools ช่วยตามหา EXC_BAD_ACCESS'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_3fuqAEHAG_Q/TLzS0viPOnI/AAAAAAAADbA/Eia3a6WV47g/s72-c/Screen+shot+2010-10-19+at+6.05.29+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-292122508084324734</id><published>2010-10-02T06:31:00.001+07:00</published><updated>2010-10-02T06:39:57.493+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ตามหาต้นเหตุของ EXC_BAD_ACCESS</title><content type='html'>&lt;div class="rotilinks"&gt;อาจพูดได้ว่าไม่มี Objective-C programmer คนไหนเลยไม่เคยเจอปัญหา EXC_BAD_ACCESS และปัญหานี้ก็มักตามมากวนใจอยู่เนืองๆ จนบางทีอาจทำให้เราต้องเสียเวลาหาต้นเหตุของปัญหานี้เป็นเวลานานจนน่าหงุดหงิด&lt;br /&gt;&lt;br /&gt;เริ่มจากทดลองสร้างโปรแกรมที่ทำให้เกิดปัญหานี้ก่อน โดยเราจะสร้าง 2 method ขึ้นมาดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #bf2e9d;"&gt;void&lt;/span&gt;) setString{&lt;/div&gt;&lt;div style="color: #3f217c; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #4b8186;"&gt;_myArray&lt;/span&gt;&lt;span style="color: black;"&gt; = [&lt;/span&gt;&lt;span style="color: #7340a3;"&gt;NSArray&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;arrayWithObject&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #d62b24;"&gt;@"A"&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;br /&gt;และ&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #bf2e9d;"&gt;void&lt;/span&gt;) getString{&lt;/div&gt;&lt;div style="color: #3f217c; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;NSLog&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #d62b24;"&gt;@"%@"&lt;/span&gt;&lt;span style="color: black;"&gt;, [&lt;/span&gt;&lt;span style="color: #4b8186;"&gt;_myArray&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;objectAtIndex&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;]);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;br /&gt;กำหนดให้สองเหตุการณ์นี้ทำงานต่อเนื่องกัน เหตุการณ์ละรอบ&lt;br /&gt;&lt;br /&gt;เหตุการณ์แรก เมื่อ method&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 11px;"&gt;setString&lt;/span&gt;&amp;nbsp;ทำงานจะสร้าง object ของ NSArray และเก็บไว้ใน instance variable ชื่อ&amp;nbsp;&lt;span class="Apple-style-span" style="color: #4b8186; font-family: Menlo; font-size: 11px;"&gt;_myArray&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;เหตุการณ์ที่สอง เมื่อ method getString ทำงาน จะทำการอ่านค่่าจาก&amp;nbsp;&lt;span class="Apple-style-span" style="color: #4b8186; font-family: Menlo; font-size: 11px;"&gt;_myArray&lt;/span&gt;&amp;nbsp;ออกมาแสดง&lt;br /&gt;&lt;br /&gt;เมื่อเราสั่งให้โปรแกรมทำงานจะพบ EXC_BAD_ACCESS ออกมาทาง debugger ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;Program received signal:&amp;nbsp; “EXC_BAD_ACCESS”.&lt;/div&gt;&lt;br /&gt;เหตุผลก็เพราะว่า&amp;nbsp;object ที่ได้จาก method setString จะเป็น autorelease object ดังนั้นแน่นอนว่ามันจะถูกส่งเข้าไปอยู่ใน autorelease pool และถูก release ทิ้งไปเมื่อจบรอบแรกโดยอัตโนมัติ ซึ่งเหตุการณ์จริงอาจไม่ได้หาต้นเหตุของปัญหาง่ายแบบนี้ก็ได้&lt;br /&gt;&lt;br /&gt;วิธีตามหาต้นตอของ EXC_BAD_ACCESS เราจะกำหนด parameter ให้กับ Executables ที่อยู่ด้านซ้ายของ xcode window ให้ double click และเลือก get info และไปที่ tab Arguments จากนั้นเพิ่ม NSZombieEnabled และกำหนดค่าเป็น YES เข้าไปดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TKZsad97o6I/AAAAAAAADas/oPNiEv5xbQw/s1600/Screen+shot+2010-10-02+at+5.56.19+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="80" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TKZsad97o6I/AAAAAAAADas/oPNiEv5xbQw/s400/Screen+shot+2010-10-02+at+5.56.19+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;NSZombieEnabled เป็น parameter ที่ช่วยบอกว่ามี message ไหนส่งไปหา object ที่ถูก deallocate แล้ว&lt;br /&gt;&lt;br /&gt;จากนั้นลองรันโปรกรมเดิมใหม่แทนที่จะโดนตอบกลับมาด้วย EXC_BAD_ACCESS (ซึ่งไม่ช่วย hint อะไรเท่าไหร่นัก) อีก ก็จะได้ผลออกมาแบบนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;&lt;b&gt;*** -[CFArray objectAtIndex:]: message sent to deallocated instance 0x4b1dd80&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เท่านี้ก็ทำให้เราพอจะเดาได้ว่า message ตัวไหนที่ทำให้เกิด EXC_BAD_ACCESS&lt;br /&gt;&lt;br /&gt;อ่านเพิ่มเติม: &lt;a href="http://loufranco.com/blog/files/Understanding-EXC_BAD_ACCESS.html"&gt;Understanding EXC_BAD_ACCESS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-292122508084324734?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/292122508084324734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/10/excbadaccess.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/292122508084324734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/292122508084324734'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/10/excbadaccess.html' title='ตามหาต้นเหตุของ EXC_BAD_ACCESS'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3fuqAEHAG_Q/TKZsad97o6I/AAAAAAAADas/oPNiEv5xbQw/s72-c/Screen+shot+2010-10-02+at+5.56.19+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1923997984482921474</id><published>2010-09-15T09:18:00.001+07:00</published><updated>2010-09-15T09:18:54.421+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><title type='text'>อ่านค่า UUID, IMEI, ICCID ของ iPad/iPhone จาก iTunes</title><content type='html'>&lt;div class="rotilinks"&gt;หลายครั้งที่ต้องขอ UUID ของ iPhone/iPad จาก user เพื่อเอามาสร้าง Provisioning profile สำหรับ build application ลงไปในเครื่องของลูกค้า วิธีง่ายๆ ที่จะได้ UUID จากลูกค้าก็คือ ใช้ iTunes&lt;br /&gt;&lt;br /&gt;หลังจากเอา iPhone/iPad ต่อเข้ากับ iTunes แล้วเลือกที่ชื่อของเครื่องที่ปรากฏอยู่ใน List ทางซ้ายของ iTunes จากนั้นเราจะเห็นข้อมูลพื้นฐานของ iPad/iPhone ของเรา เช่น ชื่อเครื่อง, Capacity, Serial Number, Phone Number เราสามารถให้มันแสดงข้อมูลอื่นๆ เพิ่มเติมได้&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;แสดง UUID โดยการ click ที่ &amp;nbsp;Serial Number&lt;/li&gt;&lt;li&gt;แสดง IMEI และ ICCID โดยการ click ที่ Phone Number&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1923997984482921474?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1923997984482921474/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/09/uuid-imei-iccid-ipadiphone-itunes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1923997984482921474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1923997984482921474'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/09/uuid-imei-iccid-ipadiphone-itunes.html' title='อ่านค่า UUID, IMEI, ICCID ของ iPad/iPhone จาก iTunes'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-5129277361851365372</id><published>2010-09-14T14:48:00.001+07:00</published><updated>2010-09-14T14:49:18.798+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>ให้ applicationWillTerminate: ทำงานหลังจากกดปุ่ม Home</title><content type='html'>&lt;div class="rotilinks"&gt;ใน iOS4 หากเรากดปุ่ม Home เพื่อปิดโปรแกรมแล้วนั้น โปรแกรมจะถูกส่งไปให้ทำงานใน Background ทำให้เวลาเราเปิดโปรแกรมนั้นขึ้นมาใหม่จะทำให้เปิดได้เร็ว และไม่ต้องรอโหลดนาน&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;สำหรับนักพัฒนา จะเห็นว่า method ชื่อ&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 11px;"&gt;applicationWillTerminate:&lt;/span&gt;&amp;nbsp;ของ Application Delegate ไม่ทำงานหลังจากกดปุ่ม Home เหมือนอย่างที่เคยทำงานใน iPhone OS 3.x ลงไป ซึ่งวิธีทำให้ method นี้กลับมาทำงานหลังจากกดปุ่ม Home นั้นสามารถทำได้โดยแก้ไขไฟล์ application-info.plist ของโปรเจ็คได้โดยกำหนดค่าดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TI8mOp4i1rI/AAAAAAAADao/5h-8mg3A-FY/s1600/Screen+shot+2010-09-14+at+2.36.33+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="51" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TI8mOp4i1rI/AAAAAAAADao/5h-8mg3A-FY/s320/Screen+shot+2010-09-14+at+2.36.33+PM.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-5129277361851365372?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/5129277361851365372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/09/applicationwillterminate-home.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5129277361851365372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5129277361851365372'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/09/applicationwillterminate-home.html' title='ให้ applicationWillTerminate: ทำงานหลังจากกดปุ่ม Home'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3fuqAEHAG_Q/TI8mOp4i1rI/AAAAAAAADao/5h-8mg3A-FY/s72-c/Screen+shot+2010-09-14+at+2.36.33+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2164108764985304495</id><published>2010-08-31T11:21:00.001+07:00</published><updated>2010-08-31T12:38:24.381+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใส่เงาให้ UIView</title><content type='html'>&lt;div class="rotilinks"&gt;เราจะใช้ &amp;nbsp;QuartzCore ช่วยในการใส่เงา หรือ Drop Shadow ให้&amp;nbsp;&lt;a href="http://developer.apple.com/iphone/library/documentation/uikit/reference/UIView_Class/UIView/UIView.html"&gt;UIView&lt;/a&gt; ดังนั้นต้อง include QuartzCore.framework เข้ามาในโปรเจ็คก่อน จากนั้นอย่าลืม import QuartzCore เข้ามาก่อนใช้งานด้วย&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #d62b24; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #7a482f;"&gt;#import &lt;/span&gt;&amp;lt;QuartzCore/QuartzCore.h&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;วิธีทำก็คือเราจะไปเล่นกับ &lt;a href="http://developer.apple.com/iphone/library/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW31"&gt;layer&lt;/a&gt; ที่เป็น property ของ UIView ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #3f217c; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; *view = [[&lt;/span&gt;&lt;span style="color: #7340a3;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;alloc&lt;span style="color: black;"&gt;] &lt;/span&gt;initWithFrame&lt;span style="color: black;"&gt;: &lt;/span&gt;CGRectMake&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #2832cf;"&gt;100&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;100&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;100&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;100&lt;/span&gt;&lt;span style="color: black;"&gt;)];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7340a3; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #3f217c;"&gt;blueColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7340a3; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;/span&gt;layer&lt;span style="color: black;"&gt;.&lt;/span&gt;shadowColor&lt;span style="color: black;"&gt; = [[&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #3f217c;"&gt;blackColor&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #3f217c;"&gt;CGColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7340a3; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;/span&gt;layer&lt;span style="color: black;"&gt;.&lt;/span&gt;shadowOffset&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #3f217c;"&gt;CGSizeMake&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #2832cf;"&gt;3.0f&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;10.0f&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7340a3; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;/span&gt;layer&lt;span style="color: black;"&gt;.&lt;/span&gt;shadowOpacity&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;0.5f&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7340a3; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;/span&gt;layer&lt;span style="color: black;"&gt;.&lt;/span&gt;shadowRadius&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #2832cf;"&gt;10.0f&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;หลังจากกำหนดค่าให้ property ของ layer เสร็จแล้ว แปะ view ลงไปใน container เราก็จะเห็นว่า UIView ของเรามีเงาแล้ว&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/THyCfy_ltYI/AAAAAAAADZE/3xRExoQ7vBQ/s1600/Screen+shot+2010-08-31+at+11.17.24+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/THyCfy_ltYI/AAAAAAAADZE/3xRExoQ7vBQ/s1600/Screen+shot+2010-08-31+at+11.17.24+AM.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2164108764985304495?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2164108764985304495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/08/uiview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2164108764985304495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2164108764985304495'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/08/uiview.html' title='ใส่เงาให้ UIView'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3fuqAEHAG_Q/THyCfy_ltYI/AAAAAAAADZE/3xRExoQ7vBQ/s72-c/Screen+shot+2010-08-31+at+11.17.24+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-6392415759475422551</id><published>2010-08-13T01:02:00.000+07:00</published><updated>2010-08-13T01:02:58.594+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>อ่าน QR Code บน iPhone ด้วย ZBar Barcode Reader</title><content type='html'>&lt;div class="rotilinks"&gt;เพื่อไม่ให้ตก trend ตอนนี้ที่อะไร ๆ ก็มี QR code หรือ 2D barcode ไปแปะกันให้ทั่ว และโชคดีผมมี iPhone ที่พร้อมสำหรับการอ่าน QR code เสมอในทุกที่ที่ผมเจอ&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ตามหา QR code reader ที่เป็น library ของ Objective-c พบว่ามีอยู่หลายตัว ตัวหนึ่งที่ลองเล่นแล้วรู้สึกง่ายดีคือ &lt;a href="http://zbar.sourceforge.net/iphone/index.html"&gt;ZBar Barcode Reader&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;วิธีใช้ไม่ยาก แต่วิธีติดตั้งและ link library ที่จำเป็นต้องออกแรงนิดนึงก่อน&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;&lt;b&gt;Setup the Library&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;download และติดตั้ง &lt;a href="http://mercurial.selenic.com/"&gt;Mercurial&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mercurial.selenic.com/"&gt;&lt;/a&gt;เปิด terminal ขึ้นมา แล้ว clone zbar จาก repository ลงมาดังนี้&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;$ hg clone http://zbar.hg.sourceforge.net:8000/hgroot/zbar/zbar myapp/zbar&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;หลังจาก clone ลงมาเสร็จแล้ว ให้ลองทดสอบ library ด้วยการลองรันโปรแกรมชื่อ readertest และมันต้องใช้งานได้ดีด้วยการ&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;เปิดไฟล์ zbar/test/iphone/readertest.xcodeproj&lt;/li&gt;&lt;li&gt;ให้เลือก build ลง device จากนั้น Build and Go ได้เลย&lt;/li&gt;&lt;li&gt;ลอง scan QR code ดูหากได้ผลลัพธ์ออกมาถูกต้องแล้วก็ไปขั้นตอนต่อไปได้เลย&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-size: x-large;"&gt;Build Settings&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;ต่อไปเป็นการนำ library เข้ามาใช้ใน project ซึ่งต้องลงไม้ลงมือดังต่อไปนี้&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;click ขวาที่โปรเจ็คแล้วเลือก Add -&amp;gt; Existing Files... จากนั้น browse ไปที่ zbar/iphone/zbar.xcodeproj&lt;/li&gt;&lt;li&gt;เพิ่ม resource ของหน้า help ลงไปในโปรเจ็ค (ตัว view controller ที่ใช้ในการอ่านภาพ QR code จะมี help ให้ด้วย ซึ่ง help ที่มีให้จะมาอ่าน resource ตรงนี้)&amp;nbsp;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;click ขวาที่ Resources แล้วเลือก Add Existing Files... จากนั้น browse ไปที่ zbar/iphone/res/zbar-*.{html,png}&lt;/li&gt;&lt;li&gt;หมายเหตุ* ในกรณีที่เราใช้ help ที่ library มีมาให้ แต่ถ้าจะทำหน้า help เองก็ไม่จำเป็นต้องทำขั้นตอนนี้ก็ได้&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;expand node zbar.xcodeproj เราจะเห็น libzbar.a อยู่ จากนั้นเปิด node Targets และชื่อ App ของเรา เราจะเห็น Link Binary with Libraries จากนั้นให้ลาก libzbar.a ลงมาใส่ใน Link Binary with Libraries&lt;/li&gt;&lt;li&gt;ใน App target settings&lt;/li&gt;&lt;/ol&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;ที่ General Tag ตรง Direct Dependencies ให้กดเพิ่ม zbar เข้าไป&lt;/li&gt;&lt;li&gt;ที่ Linked Libraries ให้เพิ่ม library ต่อไปนี้เข้าไป&lt;/li&gt;&lt;ul&gt;&lt;li&gt;QuartzCore.framework&lt;/li&gt;&lt;li&gt;libiconv.dylib&lt;/li&gt;&lt;li&gt;AVFoundation.framework (Weak)&lt;/li&gt;&lt;li&gt;CoreMedia.framework (Weak)&lt;/li&gt;&lt;li&gt;CoreVideo.framework (Weak)&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ที่ Build tab, show All Setting for "All Configurations" ให้กำหนด Header Search Path ไปหา directory นี้&lt;/li&gt;&lt;ul&gt;&lt;li&gt;zbar/include &lt;i&gt;(not recursive)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;ที่ "All Settings" และ "Release" ให้กำหนดที่ Preprocessor Macros ดังนี้&lt;/li&gt;&lt;ul&gt;&lt;li&gt;NDEBUG=1&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TGQzouU6NzI/AAAAAAAADY8/IWK3Kx5q468/s1600/Screen+shot+2010-08-13+at+12.39.48+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TGQzouU6NzI/AAAAAAAADY8/IWK3Kx5q468/s400/Screen+shot+2010-08-13+at+12.39.48+AM.png" width="287" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TGQzr9slSoI/AAAAAAAADZA/U4NPk3bkj_c/s1600/Screen+shot+2010-08-13+at+12.33.56+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TGQzr9slSoI/AAAAAAAADZA/U4NPk3bkj_c/s400/Screen+shot+2010-08-13+at+12.33.56+AM.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ใน myapp_Prefix.pch ให้เพิ่มบรรทัดนี้ลงไป&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #814823;"&gt;#import &lt;/span&gt;&amp;lt;zbar/ZBarReaderViewController.h&amp;gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ลองสั่ง build ดู หากไม่พบ error หรือ warning อะไรเกิดขึ้นเลยให้ไปต่อได้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ที่ผ่านมาเป็นการกำหนดค่าต่างๆ ที่จำเป็น เพื่อบอก xcode เมื่อเรา build โปรเจ็คว่าต้องไปหาอะไรที่ไหนบ้าง ต่อไปจะเป็นการนำ library ไปใช้ ซึ่งจะได้ code หน้าตาแบบนี้ออกมา&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;IBAction&lt;/span&gt;) readQRCode{&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;ZBarReaderViewController&lt;span style="color: black;"&gt; *reader = [&lt;/span&gt;ZBarReaderViewController&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;new&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// (optional) to scan from images, replace with:&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//ZBarReaderController *reader = [ZBarReaderController new];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; reader.&lt;span style="color: #7e22ac;"&gt;readerDelegate&lt;/span&gt; = &lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #7e22ac;"&gt;ZBarImageScanner&lt;/span&gt; *scanner = reader.&lt;span style="color: #7e22ac;"&gt;scanner&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// TODO: (optional) additional reader configuration here&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// EXAMPLE: disable rarely used I2/5 to improve performance&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [scanner &lt;/span&gt;setSymbology&lt;span style="color: black;"&gt;: &lt;/span&gt;ZBAR_I25&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;config&lt;span style="color: black;"&gt;: &lt;/span&gt;ZBAR_CFG_ENABLE&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="color: #490084;"&gt;to&lt;/span&gt;: &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// present and release the controller&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;presentModalViewController&lt;span style="color: black;"&gt;: reader&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span style="color: #490084;"&gt;animated&lt;/span&gt;: &lt;span style="color: #d000a2;"&gt;YES&lt;/span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; [reader &lt;span style="color: #490084;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เมื่อเรียก method ด้านบนแล้ว กล้องจะเปิดขึ้นและ scan ภาพที่กล้องกำลังจับอยู่ เมื่อพบว่ามี QR code delegate method ต่อไปนี้จะทำงานทันที&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;) imagePickerController: (&lt;span style="color: #7e22ac;"&gt;UIImagePickerController&lt;/span&gt;*) reader&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;didFinishPickingMediaWithInfo: (&lt;span style="color: #7e22ac;"&gt;NSDictionary&lt;/span&gt;*) info&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;{&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// TODO: (optional) this is the image of the barcode...&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//UIImage *image =&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;//&amp;nbsp; [info objetForKey: UIImagePickerControllerOriginalImage];&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// get the results&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;id&lt;/span&gt;&lt;span style="color: black;"&gt; &amp;lt;&lt;/span&gt;NSFastEnumeration&lt;span style="color: black;"&gt;&amp;gt; results = [info &lt;/span&gt;&lt;span style="color: #490084;"&gt;objectForKey&lt;/span&gt;&lt;span style="color: black;"&gt;: &lt;/span&gt;ZBarReaderControllerResults&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #7e22ac;"&gt;ZBarSymbol&lt;/span&gt; *symbol = &lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #490084;"&gt;NSLog&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;@"results = %@"&lt;span style="color: black;"&gt;, results);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #d000a2;"&gt;for&lt;/span&gt;(symbol &lt;span style="color: #d000a2;"&gt;in&lt;/span&gt; results)&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// EXAMPLE: just grab the first barcode&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #d000a2;"&gt;break&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #d000a2;"&gt;if&lt;/span&gt;(!symbol)&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;// this should not occur, but doesn't hurt to check&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: #d000a2;"&gt;return&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// see ZBarSymbol.h for other symbol properties&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #490084;"&gt;NSLog&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;@"result = %@"&lt;span style="color: black;"&gt;, symbol.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;data&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// dismiss the controller (NB: dismiss from the *picker*)&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [reader &lt;/span&gt;dismissModalViewControllerAnimated&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;YES&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;อ่านเพิ่มเติม&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://sourceforge.net/apps/mediawiki/zbar/index.php?title=HOWTO:_Add_a_barcode_reader_to_an_iPhone_app"&gt;HOWTO: Add a barcode reader to an iPhone app&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;ul&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-6392415759475422551?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/6392415759475422551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/08/qr-code-iphone-zbar-barcode-reader.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/6392415759475422551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/6392415759475422551'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/08/qr-code-iphone-zbar-barcode-reader.html' title='อ่าน QR Code บน iPhone ด้วย ZBar Barcode Reader'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3fuqAEHAG_Q/TGQzouU6NzI/AAAAAAAADY8/IWK3Kx5q468/s72-c/Screen+shot+2010-08-13+at+12.39.48+AM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-3058061590415495264</id><published>2010-08-08T18:34:00.000+07:00</published><updated>2010-08-08T18:34:12.118+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iOS'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>แปลง View ให้เป็นรูปภาพ และการทำ Screenshot บน iOS</title><content type='html'>&lt;div class="rotilinks"&gt;วิธีการแปลง View ทั้ง View ให้กลายเป็นรูปภาพหลักการก็คือ เราจะทำการ render View ตัวที่เราต้องการลงไปใน Image Context จากนั้นก็ get รูปภาพจาก Image Context ออกมา และจากหลักการนี้เราจะได้ขั้นตอนดังต่อไปนี้&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIView&lt;/span&gt; *&lt;span style="color: #7e22ac;"&gt;view&lt;/span&gt; = _myView;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;UIGraphicsBeginImageContext&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;view&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;frame&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;size&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[[&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;view&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;layer&lt;span style="color: black;"&gt;] &lt;/span&gt;renderInContext&lt;span style="color: black;"&gt;:&lt;/span&gt;UIGraphicsGetCurrentContext&lt;span style="color: black;"&gt;()];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt;&lt;span style="color: black;"&gt; *screenshot = &lt;/span&gt;UIGraphicsGetImageFromCurrentImageContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;UIGraphicsEndImageContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;วิธีนี้ไม่ใช่การทำ screenshot หน้าจอ แต่จะเป็นการเอา View ทั้งตัวแปลงออกมาให้เป็นรูปภาพ แปลว่าแม้ View นั้นจะไม่ถูกแสดงอยู่บนจอภาพ ก็ยังถูกแปลงออกมาให้เป็นรูปได้อยู่ดี&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ไหนๆ ก็กล่าวถึงการ Capture หน้าจอ หรือการทำ Screenshot หรือการ Dump Screen แล้ว ใน Cocoa Touch Framework ก็มี function ที่ช่วยอำนวยความสะดวกในการทำ Screenshot หน้าจอเช่นกัน ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; *screenshot = [&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #490084;"&gt;imageWithCGImage&lt;/span&gt;:&lt;span style="color: #1f5a5f;"&gt;UIGetScreenImage&lt;/span&gt;()];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เราจะใช้&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 11px;"&gt;&lt;span style="color: #1f5a5f;"&gt;UIGetScreenImage&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: 11px;"&gt;()&lt;/span&gt;&amp;nbsp;เพื่อทำ Screenshot หน้าจอ โดย function นี้จะไม่ทำงานหากเราทดสอบโปรแกรมบน iPhone Simulator ทำให้ต้องทดสอบบน Device จริงเท่านั้นเราจึงจะเห็นผล&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-3058061590415495264?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/3058061590415495264/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/08/view-screenshot-ios.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3058061590415495264'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3058061590415495264'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/08/view-screenshot-ios.html' title='แปลง View ให้เป็นรูปภาพ และการทำ Screenshot บน iOS'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1330109289422414794</id><published>2010-07-26T15:24:00.001+07:00</published><updated>2010-07-26T15:25:51.090+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>เลื่อน UIScrollView ทีละครึ่งหน้า</title><content type='html'>&lt;div class="rotilinks"&gt;หลายครั้งที่เรามักเจอการเลื่อนดูอะไรบางอย่างบน UIScrollView และเมื่อ scroll หยุดวิ่งแล้ว เราจะเห็นเพียงแค่ทีละหน้าเท่านั้น ไม่สามารถเห็น item อันถัดไป หรืออันก่อนหน้าได้ เหตุผลหลักๆก็เนื่องมาจาก scrollview มันเลื่อนทีละหน้า เช่นการดูรูปใน Gallery&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;สิ่งที่เราต้องการก็คิอ scrollview ที่เลื่อนไปทีละครึ่งหน้า เพื่อให้เห็น item อันถัดไป และอันก่อนหน้าดังรูปต่อไปนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TE1Fs1n1BfI/AAAAAAAADY0/NtaH0baU_Zs/s1600/Screen+shot+2010-07-26+at+3.21.47+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TE1Fs1n1BfI/AAAAAAAADY0/NtaH0baU_Zs/s400/Screen+shot+2010-07-26+at+3.21.47+PM.png" width="215" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TE1DXl1KoKI/AAAAAAAADYw/bL3azq5FUZw/s1600/Screen+shot+2010-07-26+at+3.07.49+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/TE1DXl1KoKI/AAAAAAAADYw/bL3azq5FUZw/s400/Screen+shot+2010-07-26+at+3.07.49+PM.png" width="215" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;วิธีทำนั้นง่ายมากด้วยวิธีต่อไปนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. สมมติว่าผมมีรูปอยู่ 5 รูป ดังนั้นผมสามารถสร้าง scrollview และ content view สำหรับใส่ view ย่อยๆ ให้มีขนาดพอเหมาะกับ iPhone ได้แบบนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;UIScrollView&lt;span style="color: black;"&gt; *scrollView = [[&lt;/span&gt;UIScrollView&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;scrollView.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;darkGrayColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;scrollView.&lt;span style="color: #7e22ac;"&gt;frame&lt;/span&gt; = &lt;span style="color: #490084;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;320&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;480&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;scrollView.&lt;span style="color: #7e22ac;"&gt;contentSize&lt;/span&gt; = &lt;span style="color: #490084;"&gt;CGSizeMake&lt;/span&gt;(&lt;span style="color: #3f00dd;"&gt;320&lt;/span&gt; * &lt;span style="color: #3f00dd;"&gt;5&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;480&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;scrollView.&lt;span style="color: #7e22ac;"&gt;delegate&lt;/span&gt; = &lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;scrollView.&lt;span style="color: #7e22ac;"&gt;pagingEnabled&lt;/span&gt; = &lt;span style="color: #d000a2;"&gt;YES&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIView&lt;/span&gt; *view = [[&lt;span style="color: #7e22ac;"&gt;UIView&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #490084;"&gt;init&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;span style="color: #7e22ac;"&gt;frame&lt;/span&gt; = &lt;span style="color: #490084;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;320&lt;/span&gt; * &lt;span style="color: #3f00dd;"&gt;5&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;480&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;view.&lt;span style="color: #7e22ac;"&gt;tag&lt;/span&gt; = &lt;span style="color: #3f00dd;"&gt;100&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. จากนั้นเอา view ย่อยๆ ใส่ลงไป และเอา content view ใส่ลงไปใน scrollview ให้พร้อม และกำหนดตำแหน่งของ view ตามปกติ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImageView&lt;/span&gt; *imageView = &lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;for&lt;/span&gt;(&lt;span style="color: #d000a2;"&gt;int&lt;/span&gt; i = &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #3f00dd;"&gt;5&lt;/span&gt;; i ++){&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;imageView = [[&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImageView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;alloc&lt;span style="color: black;"&gt;] &lt;/span&gt;initWithImage&lt;span style="color: black;"&gt;: MY_IMAGE&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;imageView.&lt;span style="color: #7e22ac;"&gt;frame&lt;/span&gt; = &lt;span style="color: #490084;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;100&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;133&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;imageView.&lt;span style="color: #7e22ac;"&gt;center&lt;/span&gt; = &lt;span style="color: #490084;"&gt;CGPointMake&lt;/span&gt;((&lt;span style="color: #3f00dd;"&gt;320&lt;/span&gt;/&lt;span style="color: #3f00dd;"&gt;2&lt;/span&gt;) * (i + &lt;span style="color: #3f00dd;"&gt;1&lt;/span&gt;), &lt;span style="color: #3f00dd;"&gt;480&lt;/span&gt; / &lt;span style="color: #3f00dd;"&gt;2&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;[view &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: imageView];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;[imageView &lt;span style="color: #490084;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[scrollView &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: view];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[view &lt;span style="color: #490084;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. ขั้นที่ผ่านมายังไม่มีอะไร เป็นการแค่สร้างและจับ view ใส่ลงไปใน scrollview ธรรมดาๆ จุดสำคัญคือขั้นตอนต่อไปนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เราจะจัดการกับ event ที่เรียก delegate method ของ UIScrollViewDelegate ได้ตาม code ด้านล่างนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;) scrollViewDidScroll:(&lt;span style="color: #7e22ac;"&gt;UIScrollView&lt;/span&gt; *)scrollView {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;CGFloat&lt;/span&gt; offset = scrollView.&lt;span style="color: #7e22ac;"&gt;contentOffset&lt;/span&gt;.&lt;span style="color: #7e22ac;"&gt;x&lt;/span&gt;/&lt;span style="color: #3f00dd;"&gt;2&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;CGAffineTransform&lt;/span&gt;&lt;span style="color: black;"&gt; transform = &lt;/span&gt;CGAffineTransformMakeTranslation&lt;span style="color: black;"&gt;(offset, &lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[[scrollView &lt;span style="color: #490084;"&gt;viewWithTag&lt;/span&gt;: &lt;span style="color: #3f00dd;"&gt;100&lt;/span&gt;] &lt;span style="color: #490084;"&gt;setTransform&lt;/span&gt;:transform];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เท่านี้ก็เป็นอันเรียบร้อย ไม่ยากเลย ^_^&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1330109289422414794?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1330109289422414794/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/07/uiscrollview.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1330109289422414794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1330109289422414794'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/07/uiscrollview.html' title='เลื่อน UIScrollView ทีละครึ่งหน้า'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3fuqAEHAG_Q/TE1Fs1n1BfI/AAAAAAAADY0/NtaH0baU_Zs/s72-c/Screen+shot+2010-07-26+at+3.21.47+PM.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-7695955173298950843</id><published>2010-07-26T12:17:00.001+07:00</published><updated>2010-07-26T12:21:27.649+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='social network'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Quick Start: Publishing Feed Stories to Facebook ด้วย Facebook iPhone SDK</title><content type='html'>&lt;div class="rotilinks"&gt;เราจะโพสบางอย่างลงบน Facebook Timeline ด้วยการใช้ Facebook iPhone SDK โดยเริ่มจากการ&amp;nbsp;&lt;a href="http://github.com/facebook/facebook-iphone-sdk/"&gt;download Facebook iPhone SDK&lt;/a&gt;&amp;nbsp;และ uncompress ให้เสร็จเรียบร้อย จากนั้นให้ link เข้ามาใช้ใน project ของเราดังนี้&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;ในขณะที่เราเปิดโปรเจ็คของเราอยู่ ให้เปิดไฟล์ชื่อ&amp;nbsp;FBConnect.xcodeproj ซึ่งอยู่ในโฟลเดอร์ชื่อ src ของไฟล์ที่เรา download มา&lt;/li&gt;&lt;li&gt;ลาก group ที่ชื่อ FBConnect ที่อยู่ใน project ที่เรา download มาลงไปใส่ในโปรเจ็คของเรา&lt;/li&gt;&lt;li&gt;click ขวาที่โปรเจ็คของเราแล้วเลือก Get Info, ใน tab Build ให้ไปกำหนดค่าของ User Header Search Paths เป็น path ตำแหน่ง directory ของไฟล์ FBConnect.xcodeproj ที่เราเปิดในข้อ 1 เท่านี้ก็เรียบร้อย&lt;/li&gt;&lt;/ol&gt;สำหรับการโพสบางอย่างลงไปใน Facebook Timeline อย่างง่าย มีขั้นตอนหลักๆ 4 ขั้นตอนตามลำดับดังนี้&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;สร้าง facebook session&lt;/li&gt;&lt;li&gt;login เข้า facebook&lt;/li&gt;&lt;li&gt;grant permission เพื่อให้ได้โพสลงไปใน timeline ได้&lt;/li&gt;&lt;li&gt;โพสลงไปด้วย dialog ที่ api เตรียมไว้ให้&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;เริ่มกันเลย&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1. เริ่มจากให้ import FBConnect ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #814823;"&gt;#import &lt;/span&gt;"FBConnect/FBConnect.h"&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จากนั้นสร้าง session ด้วย factory method ของ FBSession โดยใช้ KEY ที่สามารถ&lt;a href="http://www.facebook.com/developers/apps.php"&gt;ขอได้จากที่นี่&lt;/a&gt; หากไม่สร้าง session จะไม่สามารถทำอะไรกับ facebook ได้เลย ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;if&lt;/span&gt;(![&lt;span style="color: #3a8289;"&gt;_session&lt;/span&gt; &lt;span style="color: #1f5a5f;"&gt;resume&lt;/span&gt;]){&lt;/div&gt;&lt;div style="color: #1f5a5f; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_session&lt;/span&gt;&lt;span style="color: black;"&gt; = [&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;FBSession&lt;/span&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #1f5a5f; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;sessionForApplication&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #814823;"&gt;API_KEY&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;secret&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #814823;"&gt;SECRET_KEY&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;delegate&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;สังเกตว่าในการสร้าง session จะมีการกำหนด delegate ด้วย ตัวไหน Xcode จะบอกเอง ;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2. แปะปุ่มสำหรับ login เข้า facebook ลงไปบน view และเราจะใช้ปุ่มนี้เพื่อให้ผู้ใช้ login เข้าใช้งาน facebook&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;FBLoginButton&lt;span style="color: black;"&gt;* button = [[[&lt;/span&gt;FBLoginButton&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;autorelease&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;span class="Apple-style-span" style="color: #3a8289;"&gt;view&lt;/span&gt;&amp;nbsp;&lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;:button];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;หลังจาก login เสร็จแล้ว delegate method ที่นิยามไว้ใน FBDialogDelegate ตัวนี้จะทำงาน&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;)session:(&lt;span style="color: #3a8289;"&gt;FBSession&lt;/span&gt;*)session didLogin:(&lt;span style="color: #3a8289;"&gt;FBUID&lt;/span&gt;)uid {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3. &amp;nbsp;หลังจาก user login แล้ว เราจะ Grant permission เพื่อให้เราสามารถโพสบางอย่างลงไปใน timeline ได้ ด้วยการแสดง dialog ให้ผู้ใช้ยืนยันสิทธิ์ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;FBPermissionDialog&lt;span style="color: black;"&gt;* dialog = [[[&lt;/span&gt;FBPermissionDialog&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;autorelease&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;dialog.&lt;span style="color: #7e22ac;"&gt;delegate&lt;/span&gt; = &lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;dialog.&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;permission&lt;/span&gt;&lt;span style="color: black;"&gt; = &lt;/span&gt;@"status_update"&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[dialog &lt;span style="color: #490084;"&gt;show&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;จะมี dialog ขึ้นมาให้ผู้ใช้ยืนยันว่าอนุญาติให้ application ที่กำลังใช้งานอยู่มีสิทธิ์โพสบางอย่างลงไปใน timeline ของตัวเองได้หรือไม่&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;โดยที่ dialog ที่แสดงขึ้นมาจะมี event อยู่ 2 แบบคือ ตกลง กับ ยกเลิก ซึ่งแต่ละ event จะมีการ call delegate 2 ตัวนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;)dialogDidSucceed:(&lt;span style="color: #3a8289;"&gt;FBDialog&lt;/span&gt;*)dialog {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;และ&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;)dialogDidCancel:(&lt;span style="color: #3a8289;"&gt;FBDialog&lt;/span&gt;*)dialog {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;4. เมื่อเราได้ permission สำหรับการโพสบางอย่างลงไปใน timeline แล้ว เราสามารถทดลองโพสด้วยการใช้ FBStreamDialog ได้เลยทันที ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #3a8289;"&gt;FBStreamDialog&lt;/span&gt; *streamDialog = [[[&lt;span style="color: #3a8289;"&gt;FBStreamDialog&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #490084;"&gt;init&lt;/span&gt;] &lt;span style="color: #490084;"&gt;autorelease&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;streamDialog.&lt;span style="color: #7e22ac;"&gt;delegate&lt;/span&gt; = &lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;streamDialog.&lt;span style="color: #3a8289;"&gt;userMessagePrompt&lt;/span&gt; = &lt;span style="color: #e60b00;"&gt;@"Dialog Prompt"&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;streamDialog.&lt;span style="color: #3a8289;"&gt;attachment&lt;/span&gt; = attachment;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[streamDialog &lt;span style="color: #490084;"&gt;show&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;property ชื่อ attachment ของ FBStreamDialog จะเป็นการกำหนด content ที่เราจะโพสลงไปบน wall ด้วย JSON format ตามที่ได้&lt;a href="http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29"&gt;อธิบายไว้ที่นี่&lt;/a&gt;&amp;nbsp;ซึ่งหากเรากำหนด attatchment เป็นดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;NSString&lt;/span&gt;&lt;span style="color: black;"&gt; *attachment = &lt;/span&gt;@"{\"name\":\"Facebook iPhone SDK\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"href\":\"http://developers.facebook.com/connect.php?tab=iphone\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"caption\":\"Caption\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"description\":\"Description\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"media\":[{\"type\":\"image\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"src\":\"http://img40.yfrog.com/img40/5914/iphoneconnectbtn.jpg\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"href\":\"http://developers.facebook.com/connect.php?tab=iphone/\"}],"&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"properties\":{\"another link\":{\"text\":\"Facebook home page\","&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;"\"href\":\"http://www.facebook.com\"}}}"&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เราจะได้ dialog หน้าตาแบบนี้หลังจากที่เราสั่งให้ dialog show ขึ้นมาให้เรากรอกค่าอะไรบางอย่างลงไป&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TE0RRcX2PHI/AAAAAAAADYo/3B9X-goz3Uo/s1600/Screen+shot+2010-07-26+at+11.35.48+AM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TE0RRcX2PHI/AAAAAAAADYo/3B9X-goz3Uo/s320/Screen+shot+2010-07-26+at+11.35.48+AM.jpg" width="221" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;และเมื่อกด Publish&amp;nbsp;เราจะได้หน้าตาของสิ่งที่โพสลงไปบน wall ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TE0ReSHZmGI/AAAAAAAADYs/nY4J-DN3mfg/s1600/Screen+shot+2010-07-26+at+11.10.01+AM.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="87" src="http://2.bp.blogspot.com/_3fuqAEHAG_Q/TE0ReSHZmGI/AAAAAAAADYs/nY4J-DN3mfg/s320/Screen+shot+2010-07-26+at+11.10.01+AM.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เท่านี้ก็เป็นอันเรียบร้อย&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;entry นี้ถือเป็น Quick Start Guide ดังนั้นรายละเอียดการเล่นกับ SDK ตัวนี้จะเขียนอธิบายใน entry ต่อๆ ไปครับ :)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ที่มา: &lt;a href="http://wiki.developers.facebook.com/index.php/Facebook_iPhone_SDK"&gt;Facebook iPhone SDK&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;Related Link from &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-7695955173298950843?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/7695955173298950843/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/07/quick-start-publishing-feed-stories-to.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/7695955173298950843'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/7695955173298950843'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/07/quick-start-publishing-feed-stories-to.html' title='Quick Start: Publishing Feed Stories to Facebook ด้วย Facebook iPhone SDK'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3fuqAEHAG_Q/TE0RRcX2PHI/AAAAAAAADYo/3B9X-goz3Uo/s72-c/Screen+shot+2010-07-26+at+11.35.48+AM.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-4636649002744356403</id><published>2010-06-19T11:46:00.001+07:00</published><updated>2010-06-19T20:16:59.867+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Lazy Load Objects in Nib file</title><content type='html'>&lt;div class="rotilinks"&gt;การออกแบบ View ต่างๆ แล้วเก็บลง Nib file เป็นเรื่องที่ทำให้นักพัฒนาสะดวกในการออกแบบ UI มาก แต่หากใน &amp;nbsp;Nib file นั้นมี Object ต่างๆ เยอะเกินไป หรือใน Nib file เดียว มี object ของทั้ง Application บรรจุอยู่ ก็จะทำให้เสียเวลาในการโหลด Nib file นานมาก เนื่องจากเมื่อ Nib file ถูกโหลด object ต่างๆที่อยู่ใน Nib file จะถูกโหลดให้มีชีวิตด้วย ดังนั้นเราควรแยก object ต่างๆใน Nib file ออกจากกันจากนั้นค่อยๆทยอยโหลดเข้ามาใช้เมื่อจำเป็นต้องใช้จริงๆเท่านั้น&lt;br /&gt;&lt;br /&gt;ด้วยวิธีนี้ ทำให้เราจำเป็นต้องมี Nib file มากกว่า 1 file ใน Application Bundle ส่วนวิธีแยก Nib file ที่น่าจะได้รับความนิยมมากก็คือ 1 Nib file ต่อ 1 View Controller (สังเกตจากเวลาที่เรากำลังจะสร้าง file ที่เป็น Sub class ของ UIViewController ใน Xcode จะมี check box ให้เลือกว่าจะให้สร้าง Nib file ให้ด้วยเลยไหม)&lt;br /&gt;&lt;br /&gt;แต่การแบ่งดังที่กล่าวมาอาจยังไม่เพียงพอ หากใน 1 View Controller นั้น มี object มากมายก่ายกองที่ถูกสร้างขึ้นใน Nib file ซึ่งก็แปลว่าแม้จะแยกออกมาเป็น Nib file เดียวต่อ View Controller แล้ว ก็อาจยังโหลดช้าอยู่ดี ดังนั้นใน entry นี้จะแนะนำวิธีการโหลด object จาก Nib file มากกว่า 1 Nib file มาใช้งานนั่นเอง&lt;br /&gt;&lt;br /&gt;วิธีการดังนี้&lt;br /&gt;&lt;br /&gt;สมมติว่าเรามี view controller subclass ชื่อ MainViewController ที่สร้างมาพร้อมกับ Nib file (check ในช่อง With XIB for user interface ตอนจะสร้างไฟล์) และในนั้นมี property ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: #d000a2;"&gt;@interface&lt;/span&gt; MainViewController : UIViewController {&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;IBOutlet&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;UIToolbar&lt;span style="color: black;"&gt; *&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_toolbar&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;IBOutlet&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; *&lt;/span&gt;_complexView&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;_toolbar จะเป็น Outlet ที่อยู่ใน Nib เดียวกันกับ MainViewController.xib ดังนั้นเมื่อเราโหลด MainViewController.xib ขึ้นมา เราสามารถอ้างถึง _toolbar เพื่อใช้งานได้เลยทันที&lt;br /&gt;&lt;br /&gt;_complexView คือ UIView ที่เราไม่ได้สร้างให้มันอยู่ใน MainViewController.xib (ประกาศไว้เฉยๆ) ดังนั้นเมื่อเราโหลด MainViewController.xib ขึ้นมา เราจะไม่สามารถอ้างถึง _complexView เพื่อนำมาใช้งานได้ และเมื่อลอง log ออกมาดูดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;)viewDidLoad {&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;super&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;viewDidLoad&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;NSLog(&lt;/span&gt;@"MainViewController - viewDidLoad: complexView = %@"&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_complexView&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จะพบว่าผลที่ได้คือ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;&lt;b&gt;MainViewController - viewDidLoad: complexView = (null)&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ต่อไปเราจะสร้าง Nib file อีกไฟล์หนึ่ง ชื่อ AnotherNib.nib ในนั้นบรรจุ UIView ซึ่งมีหน้าตาดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TBxJZulnsFI/AAAAAAAADYQ/LHcpzxOnZKg/s1600/Screen+shot+2010-06-19+at+11.35.22+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="357" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/TBxJZulnsFI/AAAAAAAADYQ/LHcpzxOnZKg/s400/Screen+shot+2010-06-19+at+11.35.22+AM.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ใน AnotherNib.xib ให้กำหนด File's Owner เป็น MainViewController และเมื่อ click ขวาที่ File's Owner จะพบ Outlets ที่เราได้ประกาศไว้ใน MainViewController.h ให้เราเชื่อมตัวแปร _complexView เข้าไปกับ View ใน AnotherNib.xib ซึ่ง View ตัวนี้แหละ ที่เรากำหนดจะโหลดมันเข้าไปใน MainViewController&lt;br /&gt;&lt;br /&gt;หลังจากนั้น ทดลองโหลด View ใน AnotherNib.xib เข้ามาเก็บไว้ใน _complexView ได้ดัังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;[[&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;NSBundle&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;mainBundle&lt;span style="color: black;"&gt;] &lt;/span&gt;loadNibNamed&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #e60b00;"&gt;@"AnotherNib"&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;owner&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;options&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จากโค๊ด เป็นการโหลด Nib file ที่ชื่อ AnotherNib ให้กับ self (object ที่เรียก method นี้ซึ่งก็คือ MainViewController) หลังจากโหลดเสร็จแล้ว _complexView จะมีชีวิตพร้อมใช้งานทันที และเมื่อ log ออกมาดูดังนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #e60b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;NSLog(&lt;/span&gt;@"MainViewController - viewDidLoad: complexView = %@"&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_complexView&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ก็จะเห็นว่า _complexView มีชีวิตแล้ว&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;&lt;b&gt;MainViewController - viewDidLoad: complexView = &amp;lt;UIView: 0x391e830; frame = (0 250; 320 100); autoresize = RM+BM; layer = &amp;lt;CALayer: 0x3909410&amp;gt;&amp;gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/485425/permanent/blogspot/LazyLoadNib.zip"&gt;ตัวอย่าง&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-4636649002744356403?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/4636649002744356403/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/06/lazy-load-objects-in-nib-file.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4636649002744356403'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4636649002744356403'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/06/lazy-load-objects-in-nib-file.html' title='Lazy Load Objects in Nib file'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3fuqAEHAG_Q/TBxJZulnsFI/AAAAAAAADYQ/LHcpzxOnZKg/s72-c/Screen+shot+2010-06-19+at+11.35.22+AM.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-565378674066567137</id><published>2010-06-09T18:28:00.003+07:00</published><updated>2010-06-09T18:35:11.138+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>How to Crop an Image</title><content type='html'>&lt;div class="rotilinks"&gt;พระเอกของการ crop รูปก็คือ &lt;a href="http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/CGImage/Reference/reference.html#//apple_ref/doc/uid/TP30000956-CH1g-BAJHJABE"&gt;CGImageCreateWithImageInRect&lt;/a&gt; วิธีการใช้งาน function นี้ให้ใส่ parameter เพียงสองตัวเท่านั้น คือ&lt;br /&gt;&lt;ol&gt;&lt;li&gt;UIImage คือ รูปที่เราต้องการ crop&amp;nbsp;&lt;/li&gt;&lt;li&gt;CGRect คือ ตำแหน่งที่เราต้องการ crop&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;ตัวอย่างการใช้งาน&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; *image = [&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #490084;"&gt;imageNamed&lt;/span&gt;: &lt;span style="color: #e60b00;"&gt;@"witch.png"&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;CGRect&lt;/span&gt; cropRect = &lt;span style="color: #490084;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;160&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;115&lt;/span&gt;);&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;CGImageRef&lt;/span&gt;&lt;span style="color: black;"&gt; imageRef = &lt;/span&gt;CGImageCreateWithImageInRect&lt;span style="color: black;"&gt;([image &lt;/span&gt;CGImage&lt;span style="color: black;"&gt;], cropRect);&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; *newImage = [&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #490084;"&gt;imageWithCGImage&lt;/span&gt;: imageRef];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImageView&lt;/span&gt; *newImageView = [[&lt;span style="color: #7e22ac;"&gt;UIImageView&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #490084;"&gt;initWithImage&lt;/span&gt;: newImage];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;span style="color: #3a8289;"&gt;window&lt;/span&gt; &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: newImageView];&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;เพียงเท่านี้ เราก็จะได้รูปที่ crop แล้ว&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TA95xKRl9nI/AAAAAAAADYI/fykXzZbXhuU/s1600/Screen+shot+2010-06-09+at+6.22.59+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/TA95xKRl9nI/AAAAAAAADYI/fykXzZbXhuU/s320/Screen+shot+2010-06-09+at+6.22.59+PM.png" width="213" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;รูปด้านบนคือรูปต้นฉบับ รูปด้านล่างคือรูปที่ถูก crop แล้ว&lt;br /&gt;&lt;br /&gt;ที่มา: &lt;a href="http://iphonedevelopertips.com/graphics/how-to-crop-an-image.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+IphoneDeveloperTips+%28iPhone+Developer+Tips%29&amp;amp;utm_content=Google+Reader"&gt;How to Crop an Image&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-565378674066567137?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/565378674066567137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/06/how-to-crop-image.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/565378674066567137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/565378674066567137'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/06/how-to-crop-image.html' title='How to Crop an Image'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3fuqAEHAG_Q/TA95xKRl9nI/AAAAAAAADYI/fykXzZbXhuU/s72-c/Screen+shot+2010-06-09+at+6.22.59+PM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1623008403922885380</id><published>2010-05-14T07:53:00.001+07:00</published><updated>2010-05-14T14:05:50.099+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใช้ Tab Bar ใน iPhone OS</title><content type='html'>&lt;div class="rotilinks"&gt;อีกครั้งกับ entry ง่ายๆ สำหรับผู้เริ่มต้นด้วยการใช้ Tab bar ใน iPhone, iPad&lt;br /&gt;&lt;br /&gt;การใช้ Tab Bar ถือเป็นวิธีการหลักอันหนึ่ง ที่มักถูกเลือกมาใช้ช่วยในการจัดกลุ่ม content ของโปรแกรมออกเป็นกลุ่ม ซึ่งพบเห็นได้ทั่วไปในโปแกรมหลักๆ บน iPhone&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เราจะใช้ &lt;a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html"&gt;UITabBarController&lt;/a&gt; ในการสร้าง Tab Bar ขึ้นมาใช้งาน ซึ่งใจความหลักแล้ว UITabBarController จะเก็บ Array ของ view controller และแสดงมันออกมานั่นเอง หรือให้มองว่ามันเป็น Array ของ View Controller ไปเลยก็ได้เหมือนกัน&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;หากเราเป็น reference ของ &lt;a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html"&gt;UIViewController&lt;/a&gt; ดูแล้วจะพบว่ามันมี property ชื่อ &lt;a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006926-CH3-SW43"&gt;tabBarItem&lt;/a&gt; ให้เราด้วย ซึ่งนั่นทำให้เราพอจะมีขั้นตอนการสร้าง Tab Bar ขึ้นมาใช้งานในโปแกรมของเราได้คร่าวๆดังนี้&lt;/div&gt;&lt;div&gt;&lt;ol&gt;&lt;li&gt;สร้าง UIViewController มากกว่า 1 อัน และเก็บมันลงใน Array สำหรับนำมาใส่ใน UITabBarController&lt;/li&gt;&lt;li&gt;กำหนด tab bar item ให้กับ UIViewController แต่ละอัน (ขั้นตอนนี้ไม่จำเป็นต้องทำก็ได้ แต่ควรทำ)&lt;/li&gt;&lt;li&gt;สร้าง UI  TabBarController และกำหนด &lt;a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006931-CH3-SW3"&gt;viewControllers&lt;/a&gt; ให้กับมันด้วยการนำ Array ของ UIViewController มากำหนดค่าให้&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;เริ่มจากสร้าง UIViewController และกำหนด UITabBarItem ให้&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIViewController&lt;/span&gt; *firstViewController = [[&lt;span style="color: #7e22ac;"&gt;UIViewController&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #490084;"&gt;init&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;firstViewController.&lt;span style="color: #7e22ac;"&gt;view&lt;/span&gt;.&lt;span style="color: #7e22ac;"&gt;backgroundColor&lt;/span&gt; = [&lt;span style="color: #7e22ac;"&gt;UIColor&lt;/span&gt; &lt;span style="color: #490084;"&gt;redColor&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UITabBarItem&lt;/span&gt; *firstTabBarItem = [[&lt;span style="color: #7e22ac;"&gt;UITabBarItem&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;]&amp;nbsp;&lt;span class="Apple-style-span" style="color: #490084;"&gt;initWithTabBarSystemItem&lt;span style="color: black;"&gt;: &lt;/span&gt;UITabBarSystemItemFeatured&lt;span style="color: black;"&gt; &lt;/span&gt;tag&lt;span style="color: black;"&gt;: &lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;firstViewController.&lt;span style="color: #7e22ac;"&gt;tabBarItem&lt;/span&gt; = firstTabBarItem;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;จากนั้นสร้าง UIViewController อันอื่นๆ เพิ่มอีกในลักษณะเดียวกัน (ตามตัวอย่างจะสร้าง secondViewController และ thirdViewController เพิ่มขึ้นมา) และนำมาเก็บลงไปใน NSArray ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;NSArray&lt;/span&gt; *viewArray = [[&lt;span style="color: #7e22ac;"&gt;NSArray&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #490084;"&gt;initWithObjects&lt;/span&gt;:&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;&amp;nbsp; firstViewController,&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;&amp;nbsp; secondViewController,&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;&amp;nbsp; thirdViewController,&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;      &lt;/span&gt;&amp;nbsp; &lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;สร้าง UITabBarController ขึ้นมา และกำหนด viewArray ที่เราได้สร้างขึ้นให้กับมัน พร้อมทั้งใส่ tab bar ลงไปใน window&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;UITabBarController&lt;span style="color: black;"&gt; *tabBarController = [[&lt;/span&gt;UITabBarController&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;tabBarController.&lt;span style="color: #7e22ac;"&gt;viewControllers&lt;/span&gt; = viewArray;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;span style="color: #3a8289;"&gt;window&lt;/span&gt; &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: tabBarController.&lt;span style="color: #490084;"&gt;view&lt;/span&gt;];&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เท่านี้ก็เรียบร้อย&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;จะเห็นได้ว่าหากเราจะสร้าง Tab Bar ขึ้นมาใช้เอง เราไม่จำเป็นต้องพึ่ง Interface Builder &amp;nbsp;(IB) ช่วยเลยแม้แต่น้อย ซึ่งสำหรับบางคนหากมองว่าการใช้ IB ช่วยมันซับซ้อนก็อาจใช้วิธีนี้แทนก็ได้ และใช้ IBแค่การ design content ใน view เป็นหลักอย่างเดียวเลยก็ได้&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1623008403922885380?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1623008403922885380/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/05/tab-bar-iphone-os.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1623008403922885380'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1623008403922885380'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/05/tab-bar-iphone-os.html' title='ใช้ Tab Bar ใน iPhone OS'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-3667691305821063922</id><published>2010-05-13T23:32:00.002+07:00</published><updated>2010-05-13T23:41:53.630+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><title type='text'>การใช้ UIScrollView</title><content type='html'>&lt;div class="rotilinks"&gt;ปกติแล้วเราจะใช้ &lt;a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIScrollView_Class/Reference/UIScrollView.html"&gt;UIScrollView&lt;/a&gt; ช่วยในการแสดง content ที่มีขนาดใหญ่กว่าพื้นที่แสดงผล วิธีใช้งานโดยทั่วไปมีหลักการดังนี้&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;สร้าง UIScrollView&lt;/li&gt;&lt;li&gt;กำหนดขนาดของ content ที่จะแสดง (โดยมากมักใหญ่กว่าขนาดของ UIScrollView)&lt;/li&gt;&lt;li&gt;เอา view ใส่ลงไปใน UIScrollView&lt;/li&gt;&lt;/ol&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;BOOL&lt;/span&gt;)application:(&lt;span style="color: #7e22ac;"&gt;UIApplication&lt;/span&gt; *)application didFinishLaunchingWithOptions:(&lt;span style="color: #7e22ac;"&gt;NSDictionary&lt;/span&gt; *)launchOptions { &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// Override point for customization after application launch&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; *image = [&lt;span style="color: #7e22ac;"&gt;UIImage&lt;/span&gt; &lt;span style="color: #490084;"&gt;imageNamed&lt;/span&gt;: &lt;span style="color: #e60b00;"&gt;@"ipad.jpg"&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UIImageView&lt;/span&gt; *imageView = [[&lt;span style="color: #7e22ac;"&gt;UIImageView&lt;/span&gt; &lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;] &lt;span style="color: #490084;"&gt;initWithImage&lt;/span&gt;: image];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[imageView &lt;span style="color: #490084;"&gt;setTag&lt;/span&gt;: &lt;span style="color: #814823;"&gt;100&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-style-span" style="color: #008b00;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;// Step 1&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;&lt;span style="color: black;"&gt; = [[&lt;/span&gt;UIScrollView&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;.&lt;span style="color: #7e22ac;"&gt;frame&lt;/span&gt; = &lt;span style="color: #490084;"&gt;CGRectMake&lt;/span&gt;(&lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;0&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;320&lt;/span&gt;, &lt;span style="color: #3f00dd;"&gt;480&lt;/span&gt; - &lt;span style="color: #3f00dd;"&gt;20&lt;/span&gt;);&lt;/div&gt;&lt;div style="color: #7e22ac; font: normal normal normal 11px/normal Menlo; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;"&gt;&lt;span class="Apple-style-span" style="color: black; font-family: Times;"&gt;&lt;span class="Apple-style-span" style="font-size: medium;"&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-style-span" style="color: #008b00;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;// Step 2&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;contentSize&lt;span style="color: black;"&gt; = image.&lt;/span&gt;size&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-style-span" style="color: #008b00;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;// Step 3&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt; &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: imageView];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[imageView &lt;span style="color: #490084;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;UIViewController&lt;span style="color: black;"&gt; *mainViewController = [[&lt;/span&gt;UIViewController&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[mainViewController.&lt;span style="color: #7e22ac;"&gt;view&lt;/span&gt; &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: &lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;];&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;/span&gt;_scrollView&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;release&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;span style="color: #3a8289;"&gt;window&lt;/span&gt; &lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;: mainViewController.&lt;span style="color: #490084;"&gt;view&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[mainViewController &lt;span style="color: #490084;"&gt;release&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;window&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;makeKeyAndVisible&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #d000a2; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;return&lt;span style="color: black;"&gt; &lt;/span&gt;YES&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Menlo; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: #3a8289; font-family: Menlo; font-size: 11px;"&gt;_scrollView&lt;/span&gt;&amp;nbsp;เป็น ivar เอาไว้อ้างถึงในภายหลัง เท่านี้เราก็จะได้ scrollview ที่เลื่อน content ข้างในไปมาได้แล้ว&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;จากตัวอย่างด้านบน เราใช้ UIScrollView เพื่อแสดงรูป ถึงตรงนี้ เรายังไม่สามารถใช้ 2 นิ้วซูมรูป (zoom) เข้า/ออก เพื่อย่อขยายรูปได้อย่างที่เคยทำได้ใน Photo Gallery&amp;nbsp;เพื่อที่จะทำแบบนั้นได้ ให้เพิ่ม code ลงไปดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;เริ่มจากกำหนด delegate ให้กับ&amp;nbsp;&lt;span class="Apple-style-span" style="color: #3a8289; font-family: Menlo; font-size: 11px;"&gt;_scrollView&lt;/span&gt;&amp;nbsp;ก่อน&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_scrollView&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;delegate&lt;/span&gt;&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;จากนั้นกำหนดขนาดเล็กสุดของรูปที่จะถูกย่อได้ และขนาดใหญ่สุดของรูปที่จะถูกขยายได้ จากตัวอย่างกำหนดให้ขนาดเล็กสุด เป็นขนาดพอดีกับความกว้างของพื้นที่แสดงผล และขนาดใหญ่สุดคือ 10 เท่าของรูป ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #d000a2;"&gt;float&lt;/span&gt; minScale&amp;nbsp; = [&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt; &lt;span style="color: #490084;"&gt;frame&lt;/span&gt;].&lt;span style="color: #7e22ac;"&gt;size&lt;/span&gt;.&lt;span style="color: #7e22ac;"&gt;width&lt;/span&gt;&amp;nbsp; / [imageView &lt;span style="color: #490084;"&gt;frame&lt;/span&gt;].&lt;span style="color: #7e22ac;"&gt;size&lt;/span&gt;.&lt;span style="color: #7e22ac;"&gt;width&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;minimumZoomScale&lt;span style="color: black;"&gt; = minScale;&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;maximumZoomScale&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;10&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;และ implemente delegate method ดังนี้&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #7e22ac;"&gt;UIView&lt;/span&gt; *)viewForZoomingInScrollView:(&lt;span style="color: #7e22ac;"&gt;UIScrollView&lt;/span&gt; *)scrollView {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #7e22ac;"&gt;UIView&lt;/span&gt; *view = &lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #d000a2;"&gt;if&lt;/span&gt; (scrollView == &lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt;) {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; view = [&lt;span style="color: #3a8289;"&gt;_scrollView&lt;/span&gt; &lt;span style="color: #490084;"&gt;viewWithTag&lt;/span&gt;:&lt;span style="color: #814823;"&gt;100&lt;/span&gt;];&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; }&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; &lt;span style="color: #d000a2;"&gt;return&lt;/span&gt; view;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;br /&gt;&lt;/div&gt;จาก code เราจะ return view ที่เราจะย่อ/ขยายมันกลับออกไป โดยเรียก view นั้นอิงจาก tag ที่เราแปะไว้ให้ในตอนแรก เท่านี้ก็เป็นอันเรียบร้อย&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://dl.dropbox.com/u/485425/permanent/blogspot/SimpleUIScrollView.zip"&gt;ตัวอย่าง&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-3667691305821063922?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/3667691305821063922/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/05/uiscrollview.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3667691305821063922'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3667691305821063922'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/05/uiscrollview.html' title='การใช้ UIScrollView'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-8885348590963212231</id><published>2010-05-13T11:32:00.003+07:00</published><updated>2010-05-14T08:00:00.109+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='self'/><title type='text'>รูปถ่ายเมื่อปีที่แล้ว</title><content type='html'>&lt;div class="rotilinks"&gt;ปีนี้ไปต่างจังหวัดไม่ได้ถ่ายรูปอะไรเท่าไหร่เลย เพราะอากาศร้อนมาก เลยไม่ได้ออกไปทำกิจกรรมที่เน้นถ่ายรูปเท่าไหร่&lt;br /&gt;&lt;br /&gt;ส่วนปีที่แล้วกลับบ้านช่วงสงกรานต์ได้ไปถ่ายรูปในแบบที่ไม่เคยถ่าย ได้เซ็ตนี้มา&lt;br /&gt;ตอนนั้นคิดว่ารูปการทำกิจกรรมแบบชาวบ้านๆ งมหาปลาในสระน้ำกลางทุ่งหายากมาก ไม่ค่อยเห็นใครสนใจจะไปถ่ายสักเท่าไหร่ เลยตัดสินใจลุยทุ่งไปบันทึกภาพเก็บไว้สักหน่อย&lt;br /&gt;&lt;br /&gt;ตอนที่ไปเก็บภาพเหล่านี้ผมได้เรียนรู้อะไรหลายๆ อย่างที่คนที่อยู่แต่ในเมืองอย่างผม ไม่รู้ ทำไม่เป็น และไม่เคยรู้มาก่อนเลย&lt;br /&gt;&lt;br /&gt;จริงๆ อยากหาโอกาสไปลุยทุ่งถ่ายรูปตอนชาวบ้านดำนากันหลังแข็งกลางทุ่ง ตากแดดร้อนๆ บ้างเหมือนกัน&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/S-t-nfzDlAI/AAAAAAAADXw/uFzabqnBPkc/s1600/Screen+shot+2010-05-13+at+11.20.41+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/S-t-nfzDlAI/AAAAAAAADXw/uFzabqnBPkc/s640/Screen+shot+2010-05-13+at+11.20.41+AM.png" width="545" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;เห็นว่าใน Flickr มัน embed Flash ได้ด้วย เลยลองเอามาแปะดูหน่อย ได้หน้าตาแบบนี้มา&lt;/div&gt;&lt;span class="Apple-style-span"    style="  ;font-family:Arial, Helvetica, sans-serif;font-size:small;color:#222222;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:12px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;object height="300" width="400"&gt; &lt;param name="flashvars" value="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2Fkhomkrit%2Fsets%2F72157616535986161%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fkhomkrit%2Fsets%2F72157616535986161%2F&amp;amp;set_id=72157616535986161&amp;amp;jump_to="&gt;&lt;param name="movie" value="http://www.flickr.com/apps/slideshow/show.swf?v=71649"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;embed type="application/x-shockwave-flash" src="http://www.flickr.com/apps/slideshow/show.swf?v=71649" allowfullscreen="true" flashvars="offsite=true&amp;amp;lang=en-us&amp;amp;page_show_url=%2Fphotos%2Fkhomkrit%2Fsets%2F72157616535986161%2Fshow%2F&amp;amp;page_show_back_url=%2Fphotos%2Fkhomkrit%2Fsets%2F72157616535986161%2F&amp;amp;set_id=72157616535986161&amp;amp;jump_to=" width="400" height="300"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;รูปทั้งหมดในเซ็ตนี้ &lt;a href="http://www.flickr.com/photos/khomkrit/sets/72157616535986161/"&gt;http://www.flickr.com/photos/khomkrit/sets/72157616535986161/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-8885348590963212231?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/8885348590963212231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/05/blog-post.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8885348590963212231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8885348590963212231'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/05/blog-post.html' title='รูปถ่ายเมื่อปีที่แล้ว'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_3fuqAEHAG_Q/S-t-nfzDlAI/AAAAAAAADXw/uFzabqnBPkc/s72-c/Screen+shot+2010-05-13+at+11.20.41+AM.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-6385772870984143702</id><published>2010-04-26T07:16:00.001+07:00</published><updated>2010-04-26T07:20:07.516+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='ipad'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใช้ Split View ใน iPad</title><content type='html'>&lt;div class="rotilinks"&gt;ใน iPad มี UI แบบใหม่ๆ ที่เราไม่เคยได้ใช้ใน iPhone เพิ่มเข้ามาด้วย&amp;nbsp;หลักๆ ที่เรามักเห็นในโปรแกรมทั่วไปก็คือ Popover และ Split View&lt;br /&gt;&lt;br /&gt;Split View ช่วยให้เราแบ่งหน้าจอการทำงานออกเป็น 2 ข้าง โดย panel ทางด้านซ้ายจะมีความกว้างตายตัวคือ 320 pixels ส่วน panel ทางขวา นั้นจะกว้างตามขนาดของหน้าจอที่เหลือ โดยทั่วไปเมื่อหน้าจอเป็น landscape แล้ว split view จะแสดงทั้ง 2 pane (ต่อไปจะเรียก pane ทางซ้ายว่า Master pane และเรียก pane ทางขวาว่า Detail pane) แต่หากเรา rotate หน้าจอเป็น portrait แล้ว master pane ก็จะหายไปเหลือแต่ detail pane ที่ยังอยู่&lt;br /&gt;&lt;br /&gt;โดยทั่วไป หากเราต้องการใช้งาน master pane ที่หายไปใน portrait mode จะใช้้วิธีเพิ่มปุ่มลงไปที่ toolbar/navigation bar ของ detail pane และเมื่อกดปุ่มนั้นแล้ว pane ทางซ้ายจะถูกแสดงขึ้นมาใน Popover view ดังรูปด้านล่าง&lt;br /&gt;&lt;br /&gt;&lt;span id="goog_1612195313"&gt;&lt;/span&gt;&lt;span id="goog_1612195314"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/S9PFgj8ABUI/AAAAAAAADXQ/M5G7cOxGenc/s1600/Screen+shot+2010-04-25+at+11.07.28+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/S9PFgj8ABUI/AAAAAAAADXQ/M5G7cOxGenc/s320/Screen+shot+2010-04-25+at+11.07.28+AM.png" width="230" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Popover view จะเป็นหน้าต่างเล็กๆที่จะแสดงขึ้นมาเมื่อเรากดปุ่มอะไรบางอย่าง โดยพบเห็นได้ทั่วไปในโปรแกรมที่มีการใช้ split view อยู่แล้ว&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;และนี่คือลักษณะโดยทั่วไปของการใช้งาน split view เป็น landscape mode จะแสดงทั้งสอง pane หากเป็น portrait จะแสดงแค่ detail pane และเมื่อมีการกดปุ่มที่ toolbar/navigation bar จะแสดง popover view ออกมา ซึ่งในนั้นบรรจุ master pane อยู่ด้านใน ดังรูปด้านล่าง&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/Art/splitview_master.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="https://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/Art/splitview_master.jpg" width="356" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;สำหรับตัวอย่างของ split pane ให้หาดูได้จากโปรแกรมอย่างเช่น Notes และ Mail ที่ติดมากับ iPad&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;ลองใช้ Split View กันดีกว่า&lt;br /&gt;&lt;br /&gt;หลักการก็คือ สร้าง split view ขึ้นมาจาก UISplitViewController จากนั้นสร้าง view controller อีก 2 ตัว และนำมากำหนดค่าให้กับ viewControllers ซึ่งเป็น peoperty ของ UISplitViewController จากนั้นนำ split view โยนลงไปใน window ก็เป็นอันเสร็จเรียบร้อย&lt;br /&gt;&lt;br /&gt;จากขั้นตอนดังกล่าวเราจะได้ code หน้าตาประมาณนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;BOOL&lt;/span&gt;)application:(&lt;span style="color: #7e22ac;"&gt;UIApplication&lt;/span&gt; *)application didFinishLaunchingWithOptions:(&lt;span style="color: #7e22ac;"&gt;NSDictionary&lt;/span&gt; *)launchOptions { &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #008b00; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;// Override point for customization after application launch&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_masterViewController&lt;span style="color: black;"&gt; = [[&lt;/span&gt;MainViewController&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3a8289;"&gt;_masterViewController&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;contentSizeForViewInPopover&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #490084;"&gt;CGSizeMake&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;320.0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;600.0&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3a8289;"&gt;_masterViewController&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;view&lt;span style="color: black;"&gt;.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;lightGrayColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_detailViewController&lt;span style="color: black;"&gt; = [[&lt;/span&gt;DetailViewController&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_detailViewController&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;view&lt;span style="color: black;"&gt;.&lt;/span&gt;backgroundColor&lt;span style="color: black;"&gt; = [&lt;/span&gt;UIColor&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;grayColor&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_navigationController&lt;span style="color: black;"&gt; = [[&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UINavigationController&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;initWithRootViewController&lt;/span&gt;&lt;span style="color: black;"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-style-span" style="color: #3a8289;"&gt;_masterViewController&lt;/span&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_detailNavigationController&lt;span style="color: black;"&gt; = [[&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;UINavigationController&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;initWithRootViewController&lt;/span&gt;&lt;span style="color: black;"&gt;: &lt;/span&gt;_detailViewController&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_splitVC&lt;/span&gt;&lt;span style="color: black;"&gt; = [[&lt;/span&gt;UISplitViewController&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;alloc&lt;/span&gt;&lt;span style="color: black;"&gt;] &lt;/span&gt;&lt;span style="color: #490084;"&gt;init&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_splitVC&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;viewControllers&lt;/span&gt;&lt;span style="color: black;"&gt; = [&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;NSArray&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;arrayWithObjects&lt;/span&gt;&lt;span style="color: black;"&gt;: &lt;/span&gt;_navigationController&lt;span style="color: black;"&gt;, &lt;/span&gt;_detailNavigationController&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;_splitVC&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;delegate&lt;/span&gt;&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;[&lt;/span&gt;window&lt;span style="color: black;"&gt; &lt;/span&gt;&lt;span style="color: #490084;"&gt;addSubview&lt;/span&gt;&lt;span style="color: black;"&gt;: &lt;/span&gt;_splitVC&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #490084;"&gt;view&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;[&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;window&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;makeKeyAndVisible&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="color: #d000a2; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;return&lt;span style="color: black;"&gt; &lt;/span&gt;YES&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;br /&gt;ดังที่กล่าวมาแล้วว่าโดยทั่วไปหากมีการแสดงผลใน portrait mode แล้ว master pane จะหายไป และควรจะมีปุ่มแปะที่ toolbar/ navigation bar ของ detail pane เพื่อเอาไว้เรียกใช้ master pane ที่หายไปขึ้นมาใช้งานได้ใหม่ ดังนั้นส่วนที่น่าจับตามองก็คือ ส่วนนี้&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #7e22ac; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3a8289;"&gt;_masterViewController&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;contentSizeForViewInPopover&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #490084;"&gt;CGSizeMake&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;320.0&lt;/span&gt;&lt;span style="color: black;"&gt;, &lt;/span&gt;&lt;span style="color: #3f00dd;"&gt;600.0&lt;/span&gt;&lt;span style="color: black;"&gt;);&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;master view จะถูกแสดงขึ้นมาใน popover view และนี่เป็นการกำหนดว่าหาก view นี้ถูกแสดงขึ้นมาด้วย Popover view แล้วจะให้มีขนาดเป็นเท่าไหร่&lt;br /&gt;&lt;br /&gt;จังหวะในการเพิ่มปุ่มที่ detail pane เพื่อใช้สำหรับเรียก master view ขึ้นมาเวลาอยู่ใน portrait mode เราจะทำใน split view delegate &amp;nbsp;method 2 method นี้&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;)splitViewController: (&lt;span style="color: #7e22ac;"&gt;UISplitViewController&lt;/span&gt;*)svc willHideViewController:(&lt;span style="color: #7e22ac;"&gt;UIViewController&lt;/span&gt; *)aViewController withBarButtonItem:(&lt;span style="color: #7e22ac;"&gt;UIBarButtonItem&lt;/span&gt;*)barButtonItem forPopoverController: (&lt;span style="color: #7e22ac;"&gt;UIPopoverController&lt;/span&gt;*)pc {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&amp;nbsp; &amp;nbsp; barButtonItem.&lt;span style="color: #7e22ac;"&gt;title&lt;/span&gt; = &lt;span style="color: #e60b00;"&gt;@"Master List"&lt;/span&gt;;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_detailNavigationController&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;navigationBar&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;topItem&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;setLeftBarButtonItem&lt;span style="color: black;"&gt;:barButtonItem &lt;/span&gt;animated&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;YES&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;_popoverController&lt;span style="color: black;"&gt; = pc;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;delegate method ด้านบนจะทำงานเมื่อ pane ทางซ้ามือต้องหายไปใน portrait mode&lt;br /&gt;&lt;br /&gt;โดยเราจะได้รับ bar button item ที่พร้อมตอบรับกับการถูกกด และแสดง popover view ขึ้นมาให้ เราเพียงแค่กำหนด title ให้มันเท่านั้นว่าจะให้้มันมี title ว่าอย่างไร&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;จากนั้นเก็บ pc (popover controller) ที่ถูกส่งเข้ามาไว้ใช้งานต่อไปในเหตุการณ์ด้านล่างนี้&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;- (&lt;span style="color: #d000a2;"&gt;void&lt;/span&gt;)splitViewController: (&lt;span style="color: #7e22ac;"&gt;UISplitViewController&lt;/span&gt;*)svc willShowViewController:(&lt;span style="color: #7e22ac;"&gt;UIViewController&lt;/span&gt; *)aViewController invalidatingBarButtonItem:(&lt;span style="color: #7e22ac;"&gt;UIBarButtonItem&lt;/span&gt; *)barButtonItem {&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 13.0px;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style="color: #490084; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; [&lt;/span&gt;&lt;span style="color: #3a8289;"&gt;_detailNavigationController&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;navigationBar&lt;/span&gt;&lt;span style="color: black;"&gt;.&lt;/span&gt;&lt;span style="color: #7e22ac;"&gt;topItem&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;setLeftBarButtonItem&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;animated&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #d000a2;"&gt;YES&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;/div&gt;&lt;div style="color: #3a8289; font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;_popoverController&lt;span style="color: black;"&gt; = &lt;/span&gt;&lt;span style="color: #d000a2;"&gt;nil&lt;/span&gt;&lt;span style="color: black;"&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;delegate method ด้านบนจะทำงานเมื่อการแสดงผลกลับไปสู่ landscape mode และ master pane กำลังกลับมา จากโค๊ดเราจะเอา left bar button item ออกจาก detail pane พร้อมทั้งสั่งกำหนด popover controller ที่เราเคยเก็บไว้ให้เป็น nil ไปซะ&lt;br /&gt;&lt;br /&gt;เพียงเท่านี้เราก็จะได้การใช้งาน split view ร่วมกับ popover view มาใช้อย่างง่ายๆแล้ว&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;อ่านต่อ: &lt;a href="https://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/UserInterface/UserInterface.html#//apple_ref/doc/uid/TP40009370-CH3-SW8"&gt;Creating a Split View Interface&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://dl.dropbox.com/u/485425/permanent/blogspot/SimpleUISplitView.zip"&gt;download source code ตัวอย่าง ได้ที่นี่&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-6385772870984143702?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/6385772870984143702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/04/split-view-ipad.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/6385772870984143702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/6385772870984143702'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/04/split-view-ipad.html' title='ใช้ Split View ใน iPad'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3fuqAEHAG_Q/S9PFgj8ABUI/AAAAAAAADXQ/M5G7cOxGenc/s72-c/Screen+shot+2010-04-25+at+11.07.28+AM.png' height='72' width='72'/><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1936305517858783678</id><published>2010-04-06T07:11:00.003+07:00</published><updated>2010-04-06T09:35:18.702+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>แปลง string ให้กลายเป็น NSDate ด้วย NSDateFormatter</title><content type='html'>&lt;div class="rotilinks"&gt;หากเราได้รับ input ของวันที่เข้ามาในรูปของ string ลักษณะนี้&lt;br /&gt;&lt;br /&gt;20100405&lt;br /&gt;20100406&lt;br /&gt;20100407&lt;br /&gt;&lt;br /&gt;เป็นตัวอักษร 8 หลัก ปี เดือน วัน&lt;br /&gt;แล้วเราต้องการแปลงให้เป็น object ของ NSDate เพื่อให้การนำไปใช้งานสะดวกขึ้น วิธีทำก็คือใช้ &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html"&gt;NSDateFormatter&lt;/a&gt; ช่วย โดยกำหนด format ที่จะนำเข้าให้ date formatter ตาม pattern ที่ของ string ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];&lt;br /&gt;[dateFormat setDateFormat: @"yyyyMMdd"];&lt;br /&gt;&lt;br /&gt;NSString *dateString = @"20100405";&lt;br /&gt;NSDate *date = [dateFormat dateFromString: dateString];&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;จากนั้นลอง print date ออกมาจะได้ผลลัพธ์คือ&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;&lt;b&gt;2010-04-05 00:00:00 +0700&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;หากเรายังไม่แปลง string ให้กลายมาเป็น date แล้วล่ะก็ การบวกเวลาเพิ่มเข้าไปอีก 1 วันคงไม่ใช่เรื่องง่ายนัก แต่ด้วยการที่มันอยู่ในรูปของ NSDate เราจึงใช้ method ปกติที่มีได้เลย ในที่นี่จะใช้วิธีบวกวินาทีเพิ่มเข้าไป เช่น&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;NSDate *tomorrow = [date addTimeInterval: 60 * 60 * 24 * 1];&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;เราก็จะได้ผลลัพธ์เป็นวันที่ถัดไปอีก 1 วันข้างหน้า&lt;br /&gt;&lt;br /&gt;หรือหากต้องการแปลงกลับมาให้เป็น string ใน pattern เดิม ก็ยังสามารถใช้ method &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000447-CJBFIDDA"&gt;stringFromDate:&lt;/a&gt; ได้&lt;br /&gt;และหากเราต้องการรู้อีกว่าวันนั้นตรงกับวันอะไร เราสามารถใช้ date formatter ช่วยอีกได้ ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;[dateFormat setDateFormat: @"E"];&lt;br /&gt;NSString *day = [dateFormat stringFromDate: tomorrow];&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ผลลัพธ์ที่ได้คือ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;&lt;b&gt;Tue&lt;/b&gt;&lt;/div&gt;&lt;div style="font: 11.0px Menlo; margin: 0.0px 0.0px 0.0px 28.0px; text-indent: -28.0px;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;อ่านวิธีเขียน format string อื่นๆได้จาก &lt;a href="http://unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns"&gt;ที่นีี่&lt;/a&gt; &amp;nbsp;:)&lt;br /&gt;&lt;br /&gt;ขอบคุณ &lt;a href="http://twitter.com/katanyoo"&gt;@katanyoo&lt;/a&gt; ที่ช่วยหา resource มาให้&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1936305517858783678?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1936305517858783678/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/04/string-date-nsdateformatter.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1936305517858783678'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1936305517858783678'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/04/string-date-nsdateformatter.html' title='แปลง string ให้กลายเป็น NSDate ด้วย NSDateFormatter'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2570456711648219502</id><published>2010-04-04T22:36:00.005+07:00</published><updated>2010-04-04T22:47:05.936+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Filter ข้อมูลด้วย NSPredicate</title><content type='html'>&lt;div class="rotilinks"&gt;หลายครั้งที่ผมมักเก็บข้อมูลต่างๆ ลง object แล้วนำ object เหล่านั้นเก็บไว้ใน array ก่อนนำมาใช้งาน ปัญหาที่พบก็คือหากต้องการลือก object บางตัวเพื่อนำมาใช้งานต้องเขียนโปรแกรมให้วิ่งเข้าไปวนรอบหาเอง&lt;br /&gt;&lt;br /&gt;อีกวิธีหนึ่งที่่ช่วยให้เราไม่ต้องวนรอบหา object ที่ต้องการเองก็คือ ใช้ &lt;a href="http://developer.apple.com/Mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html"&gt;NSPredicate&lt;/a&gt; ช่วย ซึ่งมันจะ filter object ที่ถูกเก็บใน array โดยอิงจาก property ต่างๆของ object แทนเรา&lt;br /&gt;&lt;br /&gt;เริ่มจากหากผมมี คลาส Person ที่มีื property ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;NSString *name;&lt;br /&gt;NSString *department;&lt;br /&gt;NSInteger salary;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;และผมมี object ของคลาส Person หลายตัวเก็บอยู่ในตัวแปร array ยาวๆ จากนั้นหากผมต้องการเลือก object ที่มี property name เป็น "Steve Jobs" ผมจะเขียน code ได้ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;NSPredicate *predicate = [NSPredicate predicateWithFormat: &lt;br /&gt;    @"name == 'Steve Jobs'"];&lt;br /&gt;[personList filterUsingPredicate: predicate];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;เราจะเรียก method ชื่อ &lt;a href="http://developer.apple.com/Mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSPredicate_Class/Reference/NSPredicate.html#//apple_ref/doc/uid/TP30001187-CJBFDADI"&gt;predicateWithFormat:&lt;/a&gt; พร้อมทั้งใส่ query string ลงไปตาม code ตัวอย่าง เท่านี้ personList ก็จะมีเฉพาะ object ของคลาส Person ที่มี name เป็น Steve Jobs แล้ว&lt;br /&gt;&lt;br /&gt;นอกจากนี้เรายังสามารถเขียน predicate format ต่างๆ ที่ซับซ้อนกว่านี้ได้อีก โดยอ่านเพิ่มเติมได้ที่ &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html"&gt;Predicate Format String Syntax&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2570456711648219502?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2570456711648219502/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/04/filter-nspredicate.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2570456711648219502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2570456711648219502'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/04/filter-nspredicate.html' title='Filter ข้อมูลด้วย NSPredicate'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-923441988758816227</id><published>2010-03-30T01:06:00.007+07:00</published><updated>2010-03-30T01:25:58.528+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Exchange data between an Adobe Flash application and a remote service with CocoaAMF</title><content type='html'>&lt;div class="rotilinks"&gt;&lt;div&gt;หลายคนคงไม่คุ้นหู หรือไม่เคยได้ยินคำว่า &lt;a href="http://en.wikipedia.org/wiki/Action_Message_Format"&gt;Action Mesasge Format&lt;/a&gt; หรือ AMF และผมได้รับภารกิจให้เขียนโปรแกรมด้วย Objective-C สำหรับติดต่อกับ server ด้วยการ serialize ActionScript objects ไปมาระหว่าง client กับ server&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;โชคดีที่พบว่า&lt;a href="http://github.com/nesium/cocoa-amf"&gt;มีคนทำ library ไว้ให้แล้วใน github &lt;/a&gt;ใช้ขื่อว่า CocoaAMF ลอง clone ลงมาทันทีพบว่ามีตัวอย่างการใช้งานที่สั่ง build และ run ได้เลย&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;concept การใช้งานหลัก ๆ ก็เดาได้ไม่ยาก โดยการใช้คลาส AMFRemotingCall เป็นหลัก และกำหนด delegate ให้มัน&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;AMFRemotingCall *remotingCall = [[AMFRemotingCall alloc] init];&lt;br /&gt;remotingCall.delegate = self;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;จากนั้นกำหนด parameter ต่างๆในลักษณะนี้ และสั่ง start&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;remotingCall.URL = [NSURL URLWithString:@"http://www.nesium.com/amfdemo/gateway.php"];&lt;br /&gt;&lt;br /&gt;remotingCall.service = @"ExampleService";&lt;br /&gt;remotingCall.method = @"add";&lt;br /&gt;&lt;br /&gt;remotingCall.arguments = [NSArray arrayWithObjects: params1, params2, nil];&lt;br /&gt;&lt;br /&gt;[remotingCall start];&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;หลังการสั่ง start แล้วจะเป็นการส่ง request ไปยัง service ปลายทางแบบ Asynchronous และเมื่อ request เสร็จสิ้นแล้ว 2 delegate method นี้จะทำงาน ค่าที่ได้เราไม่จำเป็นต้อง parse เองเพราะจะถูกเก็บอยู่ในรูปของ dictionary ให้พร้อมใช้อยู่แล้ว&lt;br /&gt;&lt;br /&gt;&lt;pre class="objc" name="code"&gt;- (void)remotingCallDidFinishLoading:(AMFRemotingCall *)remotingCall &lt;br /&gt;       receivedObject:(NSObject *)object{&lt;br /&gt;&lt;br /&gt; FlexArrayCollection *f = (FlexArrayCollection*) object;&lt;br /&gt; NSArray *array = [f source];&lt;br /&gt; NSDictionary *dict = [array objectAtIndex: 0];&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;- (void)remotingCall:(AMFRemotingCall *)remotingCall didFailWithError:(NSError *)error{&lt;br /&gt;&lt;br /&gt; NSLog(@"error = %@", error);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ขอบคุณท่าน &lt;a href="http://www.nesium.com/"&gt;nesium&lt;/a&gt; มาก ช่วยลดเวลาไปได้เยอะเลยทีเดียว&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-923441988758816227?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/923441988758816227/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/03/exchange-data-between-adobe-flash.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/923441988758816227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/923441988758816227'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/03/exchange-data-between-adobe-flash.html' title='Exchange data between an Adobe Flash application and a remote service with CocoaAMF'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-408143404170478332</id><published>2010-03-05T13:22:00.009+07:00</published><updated>2010-03-27T10:30:10.600+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>iPhone App ไหลลื่นด้วย NSOperation</title><content type='html'>&lt;div class="rotilinks"&gt;การทำงานบางอย่างต้องใช้เวลานานกว่าจะเสร็จ เช่น การ download ไฟล์จากอินเทอร์เน็ต หรือการสร้าง object ของ NSString ด้วยคำสั่งอย่าง&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="objc"&gt;[NSString stringWithContentsOfURL: url]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;และหากเราทำ operation ดังกล่าวบน main thread แล้ว ปัญหาที่มักพบก็คือ User Interface (UI) จะเกิดอาการ freeze ซึ่งนั่นอาจทำให้ผู้ใช้ (user) เกิดอาการหงุดหงิด และรู้สึกไม่ลื่นไหลอย่างที่ควรจะเป็นได้&lt;br /&gt;&lt;br /&gt;วิธีการแก้ไขอย่างง่ายๆก็คือย้าย operation ที่เข้าข่ายว่าจะทำงานนานเกินไปออกไปทำงานนอก main thread และจัดการ thread นั้นด้วยตัวเอง หรืออีกวิธีหนึ่งก็คือใช้ &lt;a href="http://developer.apple.com/mac/library/documentation/cocoa/Reference/NSOperationQueue_class/Reference/Reference.html"&gt;NSOperationQueue&lt;/a&gt; ช่วย หลักการมีดังนี้&lt;br /&gt;&lt;ol&gt;&lt;li&gt;สร้าง queue ซึ่งเป็น object ของ &lt;a href="http://developer.apple.com/mac/library/documentation/cocoa/Reference/NSOperationQueue_class/Reference/Reference.html"&gt;NSOperationQueue&lt;/a&gt;&lt;/li&gt;&lt;li&gt;สร้าง operation ซึ่งเป็น object ของ &lt;a href="http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/NSOperation_class/Reference/Reference.html"&gt;NSOperation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;เอา object ที่สร้างในข้อ 2 ใส่ลงไปใน queue (ที่สร้างในข้อ 1 )&lt;/li&gt;&lt;li&gt;release operation ทิ้ง&lt;/li&gt;&lt;/ol&gt;จากขั้นตอนดังกล่าวหน้าตา code จะเป็นลักษณะแบบนี้&lt;br /&gt;&lt;pre name="code" class="objc"&gt;NSOperationQueue *queue = [NSOperationQueue new];&lt;br /&gt;&lt;br /&gt;NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(loadDataWithOperation) object:nil];&lt;br /&gt;&lt;br /&gt;[queue addOperation:operation];&lt;br /&gt;[operation release]; &lt;br /&gt;&lt;/pre&gt;จากตัวอย่างเราจะ init ค่าของ &lt;a href="http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Reference/NSInvocationOperation_Class/Reference/Reference.html"&gt;NSInvocationOperation&lt;/a&gt; (เป็น subclass ของ NSOperation) ด้วยการกำหนด selector ชื่อ loadDataWithOperation ที่ข้างในนั้นอาจมีการทำงานบางอย่างที่ใช้เวลานาน เช่นการใช้คำสั่งเช่น&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="objc"&gt;[NSString stringWithContentsOfURL: url]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;queue จะจัดการ และเรียกใช้ method loadDataWithOperation ให้เราเองหลังจากที่มันถูกใส่ลงไปใน queue แล้วอัตโนมัติ&lt;br /&gt;&lt;br /&gt;เท่านี้ UI ก็จะไม่ freeze แล้ว และชีวิตเราก็สบายขึ้น&lt;br /&gt;&lt;br /&gt;&lt;a href="http://icodeblog.com/2010/03/04/iphone-coding-turbo-charging-your-apps-with-nsoperation/"&gt;ตัวอย่าง code เปรียบเทียบปัญหาก่อนหลัง และข้อมูลเพิ่มเติม&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-408143404170478332?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/408143404170478332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/03/iphone-app-nsoperation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/408143404170478332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/408143404170478332'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/03/iphone-app-nsoperation.html' title='iPhone App ไหลลื่นด้วย NSOperation'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-4793298656549103581</id><published>2010-01-22T17:01:00.012+07:00</published><updated>2010-03-27T10:21:02.536+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='map'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>วาดเส้นบน MKMapView (MapKit บน iPhone)</title><content type='html'>&lt;div class="rotilinks"&gt;เนื่องจาก "ตอนนี้" เราไม่สามารถวาดอะไรลงไปใน &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html"&gt;MKMapView&lt;/a&gt; ได้โดยตรง ดังนั้นหากต้องการวาดอะไรลงไป จึงจำเป็นต้องใช้วิธีอ้อมๆเล็กน้อย&lt;br /&gt;&lt;br /&gt;หลักการก็คือ วาง &lt;a href="https://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html"&gt;UIView&lt;/a&gt; ซ้อนลงไปเป็น subview ของ MKMapView และวาดเส้นต่างๆลงไปบน UIView ที่วางลงไปนั้นแทน และหากต้องการวาดเส้น โดยอิงกับจุด latitude, longitude จริงบนแผนที่ด้วยแล้ว เจะใช้ method ของ MKMapView ที่ชื่อ &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html#//apple_ref/doc/uid/TP40008205-CH3-SW7"&gt;convertCoordinate:toPointToView:&lt;/a&gt; ซึ่งผลที่ได้ก็คือเป็นการแปลงจุด latitude และ longitude ในแผนที่ให้กลายมาเป็นจุด x, y จริงบนหน้าจอ&lt;br /&gt;&lt;br /&gt;อีกจุดหนึ่งที่ต้องให้ความสนใจก็คือ เมื่อมีการขยับ หรือมีการเปลี่ยนแปลงการแสดงผลบน MKMapView ก็จะให้ UIView ที่วางทับอยู่วาดรูปใหม่อีกครั้ง เนื่องจาก latitude, longitude ที่แสดงบนหน้าจอ ไม่ใช่ x, y เดิมที่เคยวาดไปก่อนที่ MKMapView จะถูกขยับอีกแล้ว และแน่นอน พระเอกของเราคือ MKMapViewDelegate &lt;br /&gt;&lt;br /&gt;และเมื่อเรารู้แล้วว่าจุดที่เราต้องการวาดคือ x, y ไหนบนหน้าจอ การวาดอะไรลงไปก็ไม่ยาก&lt;br /&gt;&lt;br /&gt;ตัวอย่างขั้นตอนหลักๆมีดังนี้&lt;br /&gt;เริ่มแรกจะมี Array ของ &lt;a href="http://developer.apple.com/iphone/library/documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html"&gt;CLLocation&lt;/a&gt; ที่บรรจุ latitude และ longitude ไว้พร้อมใช้งาน (ทำจริงๆอาจเก็บไว้ในลักษณะอื่นๆก็ได้แล้วแต่สะดวก)&lt;br /&gt;&lt;br /&gt;จุดสำคัญคือจุดที่เราจะสั่งวาดเส้นลงไปบน UIView โดยเราจะใช้วิธี override method ชื่อ &lt;a href="https://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-BBCDGJHF"&gt;drawRect:&lt;/a&gt; ของ UIView ให้วาดเส้นลงไปตามจุดที่ต้องการ ดังนี้&lt;br /&gt;&lt;pre class="objc" name="code"&gt;- (void)drawRect:(CGRect)rect{&lt;br /&gt;&lt;br /&gt;/* สั่งให้วาดเส้นหากมีจุดที่ต้องวาด และวาดเมื่อ UIView นี้ไม่ได้ถูก hidden อยู่เท่านั้น */&lt;br /&gt;if(!self.hidden &amp;amp;&amp;amp; nil != self.points &amp;amp;&amp;amp; self.points.count &amp;gt; 0){&lt;br /&gt;&lt;br /&gt;    CGContextRef context = UIGraphicsGetCurrentContext(); &lt;br /&gt;    if(nil == self.lineColor)&lt;br /&gt;        self.lineColor = [UIColor blueColor];&lt;br /&gt;&lt;br /&gt;    CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);&lt;br /&gt;    CGContextSetRGBFillColor(context, 0.0, 0.0, 1.0, 1.0);&lt;br /&gt;    CGContextSetLineWidth(context, 2.0);&lt;br /&gt;&lt;br /&gt;    //วนรอบอ่าน coordinate ทุกๆอันใน list เพื่อแปลงเป็นจุด x, y บนหน้าจอ และวาดต่อจุดกันไปเรื่อยๆ&lt;br /&gt;    for(int idx = 0; idx &amp;lt; self.points.count; idx++){&lt;br /&gt;        CLLocation* location = [self.points objectAtIndex:idx];&lt;br /&gt;&lt;br /&gt;        //แปลง coordinate ที่เก็บไว้ใน list ให้กลายเป็นตำแหน่ง x, y บนหน้าจอ&lt;br /&gt;        CGPoint point = [self.map convertCoordinate:location.coordinate toPointToView:self];&lt;br /&gt;&lt;br /&gt;        if(idx == 0){&lt;br /&gt;           CGContextMoveToPoint(context, point.x, point.y);&lt;br /&gt;        }else{&lt;br /&gt;           CGContextAddLineToPoint(context, point.x, point.y);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    CGContextStrokePath(context);&lt;br /&gt;&lt;br /&gt;} // end if&lt;br /&gt;} //end drawRect:&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;อีก 2 delegate method ของ &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html#//apple_ref/occ/intf/MKMapViewDelegate"&gt;MKMapViewDelegate&lt;/a&gt; ที่พลาดไม่ได้ก็คือ&lt;br /&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html#//apple_ref/doc/uid/TP40008204-CH3-SW3"&gt;mapView:regionWillChangeAnimated:&lt;/a&gt;&lt;br /&gt;&lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKMapViewDelegate_Protocol/MKMapViewDelegate/MKMapViewDelegate.html#//apple_ref/doc/uid/TP40008204-CH3-SW4"&gt;mapView:regionDidChangeAnimated:&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;หากแผนที่เปลี่ยน region ใหม่ หรือกำลังจะถูกย่อ/ขยาย เลื่อนแผนที่ ให้ซ่อน UIView ออกไปก่อน&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="objc"&gt;- (void)mapView:(MKMapView *)mapView &lt;br /&gt;    regionWillChangeAnimated:(BOOL)animated{&lt;br /&gt;&lt;br /&gt;    self.hidden = YES;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;เมื่อหยุดการกระทำกับแผนที่ไปแล้ว ให้แสดง UIView พร้อมทั้งบอกให้วาดเส้นใหม่ตามจุดต่างๆอีกครั้ง &lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="objc"&gt;- (void)mapView:(MKMapView *)mapView &lt;br /&gt;    regionDidChangeAnimated:(BOOL)animated{&lt;br /&gt;&lt;br /&gt;    self.hidden = NO;&lt;br /&gt;    [self setNeedsDisplay];&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;จากตัวอย่าง พบว่ามีการสั่งให้วาดเส้นตามจุดต่างๆใหม่ทุกครั้งที่มีการเปลี่ยน region ขยับ เลื่อน หรือย่อ ขยายแผนที่ทุกครั้งไป :(&lt;br /&gt;&lt;br /&gt;หากเราปักหมุดลงไปด้วย แล้วลากเส้นเชื่อมตามลำดับ จะได้หน้าตาออกมาลักษณะนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/S1l4ESDYx2I/AAAAAAAADWo/x9LHxrB4Tl8/s1600-h/Picture%203.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/S1l4ESDYx2I/AAAAAAAADWo/x9LHxrB4Tl8/s320/Picture%203.png" width="222" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ที่มา: &lt;a href="http://spitzkoff.com/craig/?p=65"&gt;Drawing polyines or routes on a MKMapView (Using Map Kit on the iPhone)&lt;/a&gt;&lt;br /&gt;ต้นฉบับ source code Created by Craig &lt;br /&gt;&lt;br /&gt;ตัวอย่างโปรเจ็คสามารถดาวน์โหลดได้จาก&lt;a href="http://dl.dropbox.com/u/485425/permanent/blogspot/TestMapLine.zip"&gt;ที่นี่&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-4793298656549103581?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/4793298656549103581/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/01/mkmapview-mapkit-iphone.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4793298656549103581'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/4793298656549103581'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/01/mkmapview-mapkit-iphone.html' title='วาดเส้นบน MKMapView (MapKit บน iPhone)'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_3fuqAEHAG_Q/S1l4ESDYx2I/AAAAAAAADWo/x9LHxrB4Tl8/s72-c/Picture%203.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-8592794460882291346</id><published>2010-01-21T19:30:00.002+07:00</published><updated>2010-01-25T01:08:04.382+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Parse XML ด้วย NSXMLParser</title><content type='html'>&lt;div class="rotilinks"&gt;มี library หลากหลายตัวที่ช่วยให้เราสามารถ parse XML ด้วย Objective-C ได้ ซึ่งคลาสในตระกูล NS* ก็เตรียม &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html"&gt;NSXMLParser&lt;/a&gt; ให้เราได้ใช้อยู่แล้ว&lt;br /&gt;&lt;br /&gt;หลักการคร่าวๆของ NSXMLParser จะไม่ใช่การเขียนโปรแกรมวนรอบให้วิ่งไปตาม element ต่างๆที่เจอ แต่จะเป็นการเขียน code เข้าไปแทรกที่จังหวะต่างๆใน &lt;a href="http://developer.apple.com/mac/library/documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html"&gt;delegate method ที่มีให้&lt;/a&gt; ในมุมมองที่ซึ่งตัว parser จะวิ่งไปตาม element ต่างๆให้เราเอง ส่วนเราก็มีหน้าที่วาง code แทรกลงไป ว่าหาก parser วิ่งมาถึงจุดนี้ จะให้มันทำอะไรบ้าง นั่นเอง&lt;br /&gt;&lt;br /&gt;สำหรับบันทึกนี้จะเอา code เข้าไปเขียนไว้ในเหตุการณ์ต่างๆดังนี้&lt;br /&gt;เมื่อ parser วิ่งไปเจอ element (เจอ tag เปิด)&lt;br /&gt;เมื่อ parser วิ่งไปเจอ character ระหว่าง element&lt;br /&gt;เมื่อ parser วิ่งออกจาก element (เจอ tag ปิด)&lt;br /&gt;เมื่อ parser วิ่งไปจนจบ document&lt;br /&gt;&lt;br /&gt;ทั้ง 4 เหตุการณ์ดังกล่าวจะถูกแทนด้วย delegate method ต่อไปนี้ตามลำดับ&lt;br /&gt;&lt;br /&gt;parser:didStartElement:namespaceURI:qualifiedName:attributes:&lt;br /&gt;parser:foundCharacters:&lt;br /&gt;parser:didEndElement:namespaceURI:qualifiedName:&lt;br /&gt;parserDidEndDocument:&lt;br /&gt;&lt;br /&gt;ชื่อ method ยาวหน่อย ;)&lt;br /&gt;&lt;br /&gt;ครานี้ก็มาถึง code ตัวอย่างการใช้งาน โดยจะใช้ &lt;a href="http://www.w3schools.com/XML/xml_examples.asp"&gt;XML ตัวอย่าง&lt;/a&gt;จาก W3C &lt;a href="http://www.w3schools.com/XML/simple.xml"&gt;ไฟล์นี้&lt;/a&gt; โดยเริ่มจากการประกาศตัวแปรต่างเตรียมใช้งานก่อน ซึ่งจากลักษณะของ xml ตัวอย่าง จะได้ตัวแปรต่างๆดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* สำหรับเก็บรายชื่อของ food */&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSMutableArray *breakfast_menu;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* เก็บชื่อของ element ที่ตัว parser วิ่งไปถึง */&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSString *currentElement&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp; &amp;nbsp; /* อาหารแต่ละชนิดจะมี property ของตัวเอง เราจึงเลือกใช้ dictionary */ &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSMutableDictionary *currentFood;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* เอาไว้เก็บค่าชั่วคราว */&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSMutableString *currentName, *currentPrice, *currentDescription, *currentCalories;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จากนั้นเริ่มลงมือ โดยการสร้าง instance ของ NSXMLParser ก่อนด้วย xml ตัวอย่างดังกล่าว พร้อมทั้งกำหนด delegate ให้เรียบร้อย ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSString *path = @"http://www.w3schools.com/XML/simple.xml";&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; breakfast_menu = [[NSMutableArray alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSURL *xmlURL = [NSURL URLWithString: path];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; parser = [[NSXMLParser alloc] initWithContentsOfURL: xmlURL];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [parser setDelegate: self];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"start parsing");&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [parser parse];&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;แทรก code เข้าไป เมื่อ parser วิ่งไปเจอ element ใดๆ ในที่นี้จะกำหนดว่าหาก parser วิ่งไปเจอ element ชื่อ food ให้สร้าง object ต่างๆไว้รอเก็บ property ต่างๆของ food ไว้เลย&lt;br /&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if([elementName isEqualToString: @"food"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; currentFood = [[NSMutableDictionary alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; currentName = [[NSMutableString alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; currentPrice = [[NSMutableString alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; currentDescription = [[NSMutableString alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; currentCalories = [[NSMutableString alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;และเมื่อ parser วิ่งไปเจอ character ที่อยู่ระหว่าง tag ก็ให้ตรวจสอบดูว่าตอนนี้กำลังอ่านอยู่ใน element ชื่อว่าอะไร จากนั้นให้เอาค่าที่ได้เก็บไว้ในตัวแปรให้ถูกต้อง&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #274e13;"&gt;- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(![[string stringByTrimmingCharactersInSet: [NSCharacterSet whitespaceAndNewlineCharacterSet]] isEqualToString: @""]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if([currentElement isEqualToString: @"name"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentName appendString: string];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([currentElement isEqualToString: @"price"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentPrice appendString: string];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([currentElement isEqualToString: @"description"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentDescription appendString: string];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([currentElement isEqualToString: @"calories"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentCalories appendString: string];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;} &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;และเมื่อ parser วิ่งไปจนจบ element นั้นๆแล้ว ให้นำค่าที่อ่านได้นำไปเก็บไว้ใน food ที่เป็น dictionary object แต่หากพบว่า parser วิ่งออกจาก element ชื่อ food ให้นำตัวแปร currentFood ไปเก็บไว้ใน list ที่เตรียมไว้ตอนแรก&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #274e13;"&gt;- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if([elementName isEqualToString: @"name"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentFood setObject: currentName forKey: @"name"];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([elementName isEqualToString: @"price"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentFood setObject: currentPrice forKey: @"price"];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([elementName isEqualToString: @"description"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentFood setObject: currentDescription forKey: @"description"];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([elementName isEqualToString: @"calories"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [currentFood setObject: currentCalories forKey: @"calories"];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else if([elementName isEqualToString: @"food"]){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; [breakfast_menu addObject: currentFood];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เมื่อ parser วิ่งไปจนจบ document แล้วให้ลอง print ออกมาดู ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #274e13;"&gt;- (void)parserDidEndDocument:(NSXMLParser *)parser {&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"all done!");&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"food list array has %d items", [breakfast_menu count]);&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSMutableDictionary *food;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for(int i = 0; i &amp;lt; [breakfast_menu count]; i ++){&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; food = [breakfast_menu objectAtIndex: i];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"\nname: %@\nprice: %@\ndescription: %@\ncalories: %@\n\n", &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; [food objectForKey: @"name"], &lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; [food objectForKey: @"price"],&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; [food objectForKey: @"description"],&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; [food objectForKey: @"calories"]);&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;code ตัวอย่างดาวน์โหลดได้จาก&lt;a href="http://dl.dropbox.com/u/485425/permanent/blogspot/TestNSXMLParser.zip"&gt;ที่นี่&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-8592794460882291346?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/8592794460882291346/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/01/parse-xml-nsxmlparser.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8592794460882291346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8592794460882291346'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/01/parse-xml-nsxmlparser.html' title='Parse XML ด้วย NSXMLParser'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1275392804189071861</id><published>2010-01-12T15:15:00.002+07:00</published><updated>2010-01-25T01:07:27.339+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gimp'/><category scheme='http://www.blogger.com/atom/ns#' term='travel'/><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='icon'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Create Tab Bar Icon for iPhone Application with Gimp</title><content type='html'>&lt;div class="rotilinks"&gt;หลายครั้งที่เราจำเป็นต้งอใช้ tab bar icon ใน iPhone Application ของเราเอง แต่แค่ icon ต่างๆที่&lt;a href="http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/MobileHIG/SystemProvided/SystemProvided.html#//apple_ref/doc/uid/TP40006556-CH15-SW2"&gt;ระบบจัดเตรียมมาให้&lt;/a&gt;อาจไม่เพียงพอต่อความต้องการ โชคดีที่ยังมีคนใจดีหลายคน แจก tab bar icon ให้เราหา download มาใช้ได้ฟรี เช่น&lt;a href="http://glyphish.com/"&gt;ที่นี่&lt;/a&gt; &lt;a href="http://www.kombine.net/icon-design/iphone-tab-bar-icons"&gt;ที่นี่&lt;/a&gt; และ &lt;a href="http://smykes24.deviantart.com/art/iPhone-Tab-Bar-Icons-Gaming-129467506"&gt;ที่นี่&lt;/a&gt; แต่หลายครั้งที่หาไม่เจอที่ตรงกับที่เราต้องการ หรือไม่ก็อยากจะใช้รูปที่เรามามาทำเป็น tab bar icon เสียเอง ทำให้เราต้องออกแรงทำ tab bar icon ขึ้นมาใช้เองล่ะ&lt;br /&gt;&lt;br /&gt;entry นี้จะใช้ &lt;a href="http://www.gimp.org/"&gt;Gimp&lt;/a&gt; ในการเปลี่ยนรูปที่เรามีอยู่แล้วให้กลายเป็นรูปที่นำมาใช้เป็น tab bar icon ได้&lt;br /&gt;&lt;br /&gt;หลังจากมีรูปที่ต้องการนำมาทำเป็น tab bar icon และเปิดด้วย Gimp ขึ้นมาแล้ว ขั้นตอนต่อไปมีดังนี้&lt;br /&gt;&lt;br /&gt;1. เปลี่ยนรูปให้เป็นภาพ Grayscale ก่อน ที่เมนู เลือก Image &amp;gt; Mode &amp;gt; Grayscale จากนั้นพิจารณาดูว่าพื้นที่ที่เราต้องการให้แสดงตรงตามต้องการหรือไม่ (พื้นที่สีดำ จะไม่ถูกวาด พื้นที่สีขาวที่เท่านั้นที่เราจะใช้งาน) ถ้ายังให้ลองปรับความเข้าของสีดำ/ขาว หรือไม่ก็ Invert สีดำ/ขาว ก็ได้&lt;br /&gt;&lt;br /&gt;2. สร้าง layer ใหม่ขึ้นมาและกำหนด background เป็นสีขาว พร้อมทั้งให้ layer ใหม่ที่สร้างขึ้นอยู่ด้านล่างรูปที่เราจะใช้งาน&lt;br /&gt;&lt;br /&gt;3. click ขวาที่ layer ที่สร้างใหม่จากข้อ 2 (layer ด้านล่าง) แล้วเลือก Add Layer Mask... จะมีหน้าต่างเล็กๆขึ้นมา ให้เลือก Black (full transparency) จากนั้นกดปุ่ม Add&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/S0wt-3nq3gI/AAAAAAAADWI/elL7PbqjmNE/s1600-h/Picture%2018.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/S0wt-3nq3gI/AAAAAAAADWI/elL7PbqjmNE/s320/Picture%2018.png" width="235" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;4. click เลือก layer รูปของเรา (layer บนสุด) จากนั้นเลือกเครื่องมือ Clone Tool (รูปกล้องถ่ายรูป) และกดปุ่ม Ctrl ค้างไว้ พร้อมกับนำ mouse มา click ที่มุมบนซ้ายของภาพ เพื่อเริ่มต้นการ copy&lt;br /&gt;&lt;br /&gt;5. กำหนดให้ layer บนสุด invisible (click ที่รูปตาในหน้าต่าง layer) และเลือก layer ล่าง&lt;br /&gt;&lt;br /&gt;6. เลื่อน mouse มาไว้มุมบนขวาสุด (ขณะนี้ pointer ยังเป็น Clone Tool อยู่) ในตำแหน่งเดียวกับที่เรา click มุมบนซ้ายจากข้อ 4&lt;br /&gt;&lt;br /&gt;7. ลาก pointer ไปให้ทั่ว จะเห็นภาพที่เราจะใช้ถูก clone ขึ้นมา&lt;br /&gt;&lt;br /&gt;เสร็จแล้วจะได้รูปออกมาลักษณะนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_3fuqAEHAG_Q/S0wtsRp1JcI/AAAAAAAADWA/tlDtalk6Bpo/s1600-h/Picture%2016.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_3fuqAEHAG_Q/S0wtsRp1JcI/AAAAAAAADWA/tlDtalk6Bpo/s1600/Picture%2016.png" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/_3fuqAEHAG_Q/S0wt0n01gBI/AAAAAAAADWE/1QDi-gv7UHk/s1600-h/Picture%2017.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="49" src="http://1.bp.blogspot.com/_3fuqAEHAG_Q/S0wt0n01gBI/AAAAAAAADWE/1QDi-gv7UHk/s320/Picture%2017.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;สังเกตเห็นว่า หากรูปต้นแบบที่เราจะนำมาใช้ไม่ได้ใช้สีที่เข้มมากพอ ผลลัพธ์ที่ได้จะเป็น icon ที่สีของ icon ไม่ค่อยชัดเจน (ดูจางๆ) นั่นเอง&lt;br /&gt;&lt;br /&gt;อ่านต่อ: &lt;a href="http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/MobileHIG/IconsImages/IconsImages.html"&gt;iPhone HIG&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1275392804189071861?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1275392804189071861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/01/create-tab-bar-icon-for-iphone.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1275392804189071861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1275392804189071861'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/01/create-tab-bar-icon-for-iphone.html' title='Create Tab Bar Icon for iPhone Application with Gimp'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_3fuqAEHAG_Q/S0wt-3nq3gI/AAAAAAAADWI/elL7PbqjmNE/s72-c/Picture%2018.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-3432361963528153352</id><published>2010-01-04T15:16:00.003+07:00</published><updated>2010-01-25T01:08:41.158+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>Reverse Geocoding (Address Lookup) with Objective-C, iPhone</title><content type='html'>&lt;div class="rotilinks"&gt;การหาที่อยู่จาก latitude และ longitude ที่มี ปัจจุบันมี service ที่ให้เราโยน latitude, longitude เข้าไปแล้วมันจะคืนค่าสถานที่ออกมาหลายที่ ทั้งฟรี และไม่ฟรี เช่น &lt;a href="http://code.google.com/apis/maps/documentation/geocoding/#ReverseGeocoding"&gt;Reverse Geocoding (Address Lookup)&lt;/a&gt; ของ Google เป็นต้น&lt;br /&gt;&lt;br /&gt;สำหรับ MapKit framework ที่ถูกใช้ใน iPhone กันนั้นก็ใช้ map service จาก Google เช่นเดียวกัน และเราก็สามารถ reverse geocoding ได้จาก service ของ Google ดังกล่าวมาแล้วได้ตามปกติ&lt;br /&gt;&lt;br /&gt;วิธีที่กล่าวมาตอนต้น เราจำเป็นต้องส่ง HTTP request ไปเอง และต้องมี API key จาก Google ด้วย สำหรับ map kit framework แล้วง่ายกว่านั้นด้วยการใช้ &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKReverseGeocoder_Class/Reference/Reference.html"&gt;MKReverseGeocoder&lt;/a&gt; นั่นเอง&lt;br /&gt;&lt;br /&gt;สำหรับวิธีการใช้งานก็ตรงไปตรงมาคือส่ง latitude, longitude ที่ถูก wrap ให้อยู่ในรูปของ &lt;a href="http://developer.apple.com/iphone/library/documentation/CoreLocation/Reference/CLLocation_Class/CLLocation/CLLocation.html#//apple_ref/doc/c_ref/CLLocationCoordinate2D"&gt;CLLocationCoordinate2D&lt;/a&gt; เข้าไป จากนั้นสั่งให้หาที่อยู่ออกมา ผลลัพธ์ที่ได้จะถูกส่งไปยัง delegate method ทั้ง 2 เมื่อ reverse สำเร็จ หรือไม่สำเร็จ ดังนั้นจะได้หน้าตา code ดังนี้&lt;br /&gt;&lt;br /&gt;1. wrap latitude, longitude ที่มีไว้ใน CLLocationCoordinate2D ก่อน&lt;br /&gt;&lt;div style="color: #274e13;"&gt;CLLocationCoordinate2D coordinate = {&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; latitude,&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; longitude&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;};&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;2. instantiate และส่ง coordinate เป็นพารามิเตอร์เข้าไป อย่าลืมกำหนด delegate object ด้วย และสั่งให้ทำการ reverse จากนั้นก็รอ ให้เสร็จสิ้นการ reverse&lt;br /&gt;&lt;div style="color: #274e13;"&gt;MKReverseGeocoder *reverseGeocoder = [[MKReverseGeocoder alloc] initWithCoordinate: coordinate];&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;reverseGeocoder.delegate = self;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;[reverseGeocoder start];&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;3. เมื่อการ reverse เสร็จสิ้นแล้ว 1 ใน 2 delegate method นี้จะถูกเรียกให้ทำงาน&lt;br /&gt;&lt;br /&gt;&lt;div style="color: #274e13;"&gt;- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFindPlacemark:(MKPlacemark *)newPlacemark {&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; NSLog(@"%@", [[newPlacemark.addressDictionary valueForKey:@"FormattedAddressLines"] componentsJoinedByString:@", "]);&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;}&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;- (void)reverseGeocoder:(MKReverseGeocoder *)geocoder didFailWithError:(NSError *)error {&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"%@", error);&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #274e13;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;ค่าที่จะได้หลังจาก reverse สำเร็จและนำมาใช้งานหลักๆก็คือ instance ของ &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKPlacemark_Class/Reference/Reference.html"&gt;MKPlacemark&lt;/a&gt; นั่นเอง ซึ่งในนั้นจะบรรจุที่อยู่ของสถานที่ที่แปลงได้ ให้เราได้เลือกใช้ได้ว่าจะใช้ค่าไหน เช่น &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKPlacemark_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008322-CH1-SW5"&gt;addressDictionary&lt;/a&gt;, &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKPlacemark_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008322-CH1-SW14"&gt;countryCode&lt;/a&gt;, &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKPlacemark_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008322-CH1-SW12"&gt;postalCode&lt;/a&gt; และ&amp;nbsp; &lt;a href="http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKPlacemark_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008322-CH1-SW9"&gt;subLocality&lt;/a&gt; เป็นต้น&lt;br /&gt;&lt;br /&gt;อ่านต่อ: &lt;a href="http://code.google.com/apis/maps/iphone/terms.html"&gt;Google Maps Terms of Service&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-3432361963528153352?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/3432361963528153352/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2010/01/reverse-geocoding-address-lookup-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3432361963528153352'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/3432361963528153352'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2010/01/reverse-geocoding-address-lookup-with.html' title='Reverse Geocoding (Address Lookup) with Objective-C, iPhone'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-8892121471523929533</id><published>2009-12-16T23:34:00.004+07:00</published><updated>2010-01-25T01:09:15.011+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>iPhone กับการเขียนและอ่านไฟล์รูปใน document directory</title><content type='html'>&lt;div class="rotilinks"&gt;หลังจาก&lt;a href="http://khomkrit.blogspot.com/2009/12/iphone-save.html"&gt;ครั้งที่แล้ว&lt;/a&gt;เมื่อได้รูปแล้วจะเป็นการบันทึก (Save) ไว้ใน photo album แต่ในบางกรณีเราไม่ต้องการบันทึกภาพลงในนั้น แต่ต้องการแค่บันทึกภาพเก็บไว้ และคราวหน้าอาจต้องเอามาใช้งานอีก โดยไม่จำเป็นต้องให้ user เข้าถึงรูปนั้นได้ เราจะบันทึกมันไว้ใน document directory นั่นเอง&lt;br /&gt;&lt;br /&gt;จากเดิมหลังจากเลือกรูปเสร็จแล้วเราจะได้ image มาใช้ และเราเลือกที่จะบันทึกไว้ใน photo album ซึ่งหากต้องการเปลี่ยนมาเป็นการบันทึกลงไปใน document directory ก็ทำได้ดังนี้&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #274e13; font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;    NSString *documentsDirectory = [paths objectAtIndex:0];&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;    [UIImagePNGRepresentation(image) writeToFile: &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;     [documentsDirectory stringByAppendingPathComponent: @"myImage.png"] atomically: YES];&lt;/span&gt;&lt;/span&gt;    &lt;br /&gt;&lt;br /&gt;ด้านบนเป็นการใช้ function ชื่อ UIImagePNGRepresentation() เพื่อเปลี่ยน image และจากนั้นเขียน image ลงไปตาม path ที่เรากำหนดไว้ ในที่นี้ก็คือใน document directory และกำหนดชื่อไฟล์เป็น myImage.png นั่นเอง&lt;br /&gt;&lt;br /&gt;และเมื่อต้องการอ่านไฟล์ที่เราเขียนลงไปมาใช้งาน สามารถทำได้ดังนี้&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="color: #274e13; font-size: small;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if([[NSFileManager defaultManager] fileExistsAtPath: documentsDirectory]){&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"found file");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; uiImageView.image = [UIImage imageWithContentsOfFile: documentsDirectory];&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; NSLog(@"file not found");&lt;/span&gt;&lt;br style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;" /&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;เช่นเดิม ให้อ่านไฟล์ขึ้นมาจาก path ที่เราต้องการ และนำไปแสดงใน image view พร้อมใช้งานในโปรแกรมได้เลย&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-8892121471523929533?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/8892121471523929533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2009/12/document-directory.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8892121471523929533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/8892121471523929533'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2009/12/document-directory.html' title='iPhone กับการเขียนและอ่านไฟล์รูปใน document directory'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1687136174714868734</id><published>2009-12-15T19:59:00.035+07:00</published><updated>2009-12-16T23:33:49.369+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใช้ iPhone ถ่ายรูปแล้ว Save ลงเครื่อง</title><content type='html'>การเขียนโปรแกรมใน iPhone ให้ถ่ายรูป และบันทึก (Save) รูปนั้นไว้ในเครื่องนั้นสามารถทำได้ง่ายๆผ่าน UIImagePickerController เท่านั้น กระบวนท่ามีดังนี้&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UIImagePickerController *picker = [[UIImagePickerController alloc] init];&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;picker.delegate = self;  picker.allowsEditing = YES;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;picker.sourceType = UIImagePickerControllerSourceTypeCamera;  &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[self presentModalViewController:picker animated:YES]; &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;[picker release];&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;สร้าง object ของ UIImagePickerController ออกมา จากนั้นกำหนด delegate ให้มัน และแสดง picker ออกมาผ่าน modal view เท่านั้นเอง ซึ่งระหว่างก่อนที่จะแสดง picker ขึ้นมานั้น จะเห็นว่ามี 2 จุดที่เราต้องทำอะไรบางอย่างได้แก่จุดแรก&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;picker.allowsEditing = YES;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เป็นการบอกว่าหลังจากถ่ายรูปเสร็จแล้ว จะให้มีการแก้ไขรูปต่อหรือเปล่า เช่นการย่อ ขยาย เป็นต้น&lt;br /&gt;และจุดที่สองคือ&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;picker.sourceType = UIImagePickerControllerSourceTypeCamera;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เป็นการ กำหนดแหล่งที่มาของรูป จากตัวอย่างเป็นการกำหนดแหล่งที่มาของรูปคือ กล้องนั่นเอง ซึ่งนอกจากกำหนดแหล่งที่มาเป็นกล้องได้แล้ว เรายังกำหนดแหล่งที่มาได้อีก 2 แบบ ที่เป็นการเลือกรูปจากในเครื่องของเราเอง ได้แก่&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;UIImagePickerControllerSourceTypePhotoLibrary&lt;br /&gt;UIImagePickerControllerSourceTypeSavedPhotosAlbum&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;จากนั้นอย่าลืม implement delegate method ของ picker ด้วย ดังนี้&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;- (void)imagePickerController:(UIImagePickerController *)picker  &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; didFinishPickingImage:(UIImage *)image &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; editingInfo:(NSDictionary *)editingInfo { &amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), self);&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp;   [picker dismissModalViewControllerAnimated:YES];  &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;หลัง จากเราเลือก รูปเสร็จแล้ว (รวมถึงการถ่ายรูปเสร็จแล้วด้วย) method นี้จะทำงานทันที เราจะได้ reference ของ image จากนั้นก็ทำการ save ทันที โดยกำหนด selector ให้ทำงานหลังจากการ save เสร็จสิ้นไว้ด้วย หน้าตาดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;- (void) image: (UIImage*) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo{&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;NSString *str = @"Saved"; &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"Saved." message:str delegate:self cancelButtonTitle:nil otherButtonTitles: @"OK", nil]; &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; [alert show];  &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; NSLog(@"error = %@", error); &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;และอีก 1 delegate method ที่จะทำงานเมื่อเรายกเลิกการเลือกรูป ดังนี้&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; [picker dismissModalViewControllerAnimated:YES]; &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เท่านี้ก็เรียบร้อย&lt;br /&gt;&lt;br /&gt;UPDATE:&lt;br /&gt;ยัง ไม่เรียบร้อย สิ่งที่ควรเพิ่มเข้ามาสำหรับ application ที่ต้องใช้/สามารถใช้กล้องถ่ายรูปได้ก็คือการตรวจสอบว่าอุปกรณ์ที่ application ทำงานอยู่นั้นมี resource อยู่จริงหรือไม่ เช่นมี photo library หรือมีกล้องพร้อมใช้งานไหม โดยใช้ class method ของ UIImagePickerController ชื่อ isSourceTypeAvailable ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;if (![UIImagePickerController isSourceTypeAvailable: &amp;nbsp; UIImagePickerControllerSourceTypeCamera]) { &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&amp;nbsp;&amp;nbsp; // do something &lt;br /&gt;&lt;/div&gt;&lt;div style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เท่านี้ก็เรียบร้อย&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-1687136174714868734?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/1687136174714868734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2009/12/iphone-save.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1687136174714868734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/1687136174714868734'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2009/12/iphone-save.html' title='ใช้ iPhone ถ่ายรูปแล้ว Save ลงเครื่อง'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-5639749414875289048</id><published>2009-12-15T13:11:00.009+07:00</published><updated>2009-12-15T13:29:46.358+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>เปลี่ยน view โดยไม่ใช้ modal view</title><content type='html'>&lt;div class="rotilinks"&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;หลังจากบันทึกเรื่องเกี่ยวกับ&lt;a href="http://khomkrit.blogspot.com/2009/10/view-modal-view.html"&gt;&lt;span style="color: #42287d;"&gt;การเปลี่ยนไปแสดง&lt;/span&gt;&lt;span style="color: #42287d; font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;&lt;span style="color: #42287d;"&gt;อื่นด้วย&lt;/span&gt;&lt;span style="color: #42287d; font: normal normal normal 13px/normal Arial;"&gt; modal view&lt;/span&gt;&lt;/a&gt;&lt;span style="font: normal normal normal 13px/normal Arial;"&gt;&amp;nbsp;&lt;/span&gt;ไปแล้ว&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;คราวนี้จะเป็นการสลับ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; (exchange) &lt;/span&gt;ไป&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;อื่นโดยไม่จำเป็นต้องพึ่งพา&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; modal view&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 19.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;อันที่จริงแล้วการเปลี่ยนไปแสดงอีก&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;หนึ่งนั้น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;นอกจากจะใช้&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; modal view &lt;/span&gt;ดังกล่าวแล้ว&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;เรายังสามารถใช้&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; navigation controller &lt;/span&gt;ช่วย&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; push &lt;/span&gt;หน้า&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;เข้ามาแทนหน้า&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;เดิมก็ได้&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; (application &lt;/span&gt;เหล่านี้มักพบใน&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; application &lt;/span&gt;ที่มีการใช้ตาราง&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;เช่น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; Mail, iPod, Contacts &lt;/span&gt;และอื่นๆ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;เป็นต้น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; ) &lt;/span&gt;ก็ได้&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;หรือไม่ก็วิธีง่ายๆก็คือใช้&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; method addSubView: &lt;/span&gt;หรือ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; method &lt;/span&gt;จำพวก&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; insertSubview: &lt;/span&gt;ก็ได้&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 19.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;สำหรับคราวนี้พระเอกที่จะช่วยในการสลับ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;ไปแสดง&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; view &lt;/span&gt;อีกอันหนึ่งก็คือ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; method &lt;/span&gt;ชื่อ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt;&amp;nbsp;&lt;a href="http://developer.apple.com/iPhone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#jumpTo_54"&gt;&lt;span style="color: #42287d;"&gt;exchangeSubviewAtIndex:withSubviewAtIndex:&lt;/span&gt;&lt;/a&gt; &lt;/span&gt;ของ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; UIView &lt;/span&gt;นั่นเอง&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 19.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #486e2a; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;// begin animation block&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #49328a;"&gt;CGContextRef&lt;/span&gt;&lt;span style="color: black;"&gt; context = &lt;/span&gt;UIGraphicsGetCurrentContext&lt;span style="color: black;"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #49328a;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;beginAnimations&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #7d2b85;"&gt;nil&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;context&lt;span style="color: black;"&gt;:context];&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #486e2a; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;// set animation transition style&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #49328a;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;setAnimationTransition&lt;span style="color: black;"&gt;: &lt;/span&gt;UIViewAnimationTransitionCurlUp&lt;span style="color: black;"&gt; &lt;/span&gt;forView&lt;span style="color: black;"&gt;: myView&amp;nbsp;&lt;/span&gt;cache&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #7d2b85;"&gt;YES&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 19.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #49328a;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;setAnimationCurve&lt;span style="color: black;"&gt;:&lt;/span&gt;UIViewAnimationCurveEaseInOut&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #49328a;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;setAnimationDuration&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #1724b8;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 18.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #486e2a; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;&lt;/span&gt;// Animations for exchanging subview&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #7d2b85;"&gt;self&lt;/span&gt;&lt;span style="color: black;"&gt;.view &lt;/span&gt;exchangeSubviewAtIndex&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #1724b8;"&gt;0&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;withSubviewAtIndex&lt;span style="color: black;"&gt;:&lt;/span&gt;&lt;span style="color: #1724b8;"&gt;1&lt;/span&gt;&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="color: black;"&gt;&amp;nbsp;[&lt;/span&gt;&lt;span style="color: #49328a;"&gt;UIView&lt;/span&gt;&lt;span style="color: black;"&gt; &lt;/span&gt;commitAnimations&lt;span style="color: black;"&gt;];&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;&lt;span style="font: normal normal normal 13px/normal Thonburi;"&gt;สำหรับ&lt;/span&gt; method setAnimationTransition;forView:cache: &lt;span style="font: normal normal normal 13px/normal Thonburi;"&gt;จะมี&lt;/span&gt; animation type &lt;span style="font: normal normal normal 13px/normal Thonburi;"&gt;ให้เลือกทั้งหมด&lt;/span&gt; 4 &lt;span style="font: normal normal normal 13px/normal Thonburi;"&gt;แบบ&lt;/span&gt; &lt;span style="font: normal normal normal 13px/normal Thonburi;"&gt;ดังนี้&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIViewAnimationTransitionCurlUp&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIViewAnimationTransitionCurlDown&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;เป็น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; animation &lt;/span&gt;แบบพลิกกระดาษขึ้น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;และลง&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIViewAnimationTransitionFlipFromLeft&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIViewAnimationTransitionFlipFromRight&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;เป็น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; animation &lt;/span&gt;แบบพลิกหน้าจอไปทางซ้าย&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;และขวา&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;และอีก&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; 1 &lt;/span&gt;แบบคือกำหนดว่าไม่ต้องมี&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; animation &lt;/span&gt;ใดๆในการ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; exchange view&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="color: #241a62; font: 13.0px Arial; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;UIViewAnimationTransitionNone&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 11.0px Monaco; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 15.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 13.0px Thonburi; margin: 0.0px 0.0px 0.0px 0.0px;"&gt;ส่วนของ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; method&amp;nbsp; &lt;/span&gt;&lt;span style="color: #241a62; font: normal normal normal 13px/normal Arial;"&gt;setAnimationCurve&lt;/span&gt;&lt;span style="font: normal normal normal 13px/normal Arial;"&gt;: &lt;/span&gt;นั่นเป็นการกำหนดว่าจะให้แสดง&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; animation &lt;/span&gt;ในลักษณะให้ค่อยเร็วขึ้นจนจบ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;หรือว่าให้ค่อยๆช้าตอนจบ&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;ซึ่งหากไม่ได้กำหนดค่าให้&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; &lt;/span&gt;จะมี&lt;span style="font: normal normal normal 13px/normal Arial;"&gt; default &lt;/span&gt;เป็น&lt;span style="font: normal normal normal 13px/normal Arial;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #241a62; font: normal normal normal 13px/normal Arial;"&gt;UIViewAnimationCurveEaseInOut&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 19.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="font: 16.0px Times; margin: 0.0px 0.0px 0.0px 0.0px; min-height: 19.0px;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;span style="font-weight:bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-5639749414875289048?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/5639749414875289048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2009/12/view-modal-view.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5639749414875289048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/5639749414875289048'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2009/12/view-modal-view.html' title='เปลี่ยน view โดยไม่ใช้ modal view'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-2546095058949947715</id><published>2009-11-11T16:44:00.006+07:00</published><updated>2009-11-12T20:15:16.732+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='phone'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใช้ MGTwitterEngine ทำ twitter client บน iPhone</title><content type='html'>&lt;div class="rotilinks"&gt;สำหรับการพัฒนา twitter client ด้วย Cocoa ตอนแรกคิดว่าอาจต้องเหนื่อยหน่อย แต่โชคดีที่มี library ชื่อ &lt;a href="http://mattgemmell.com/2008/02/22/mgtwitterengine-twitter-from-cocoa"&gt;MATwitterEngine&lt;/a&gt;&amp;nbsp; (เขียนด้วย Objective-C) ซึ่ง application ชื่อดังอย่าง &lt;a href="http://iconfactory.com/software/twitterrific"&gt;Twitterific&lt;/a&gt; ก็นำ library ตัวนี้ไปใช้เช่นกัน&lt;br /&gt;&lt;br /&gt;ใช้ SVN checkout ได้ที่ &lt;a href="http://svn.cocoasourcecode.com/MGTwitterEngine/"&gt;http://svn.cocoasourcecode.com/MGTwitterEngine/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ในนั้นจะมีโปรเจ็คตัวอย่างให้เราทดลองเล่นดู ลอง compile และรันพบว่าใช้งานได้จริงๆด้วย! ที่สำคัญยังโชคดีที่มี README.txt ให้อ่านและข้างในยังบอกวิธีนำ library ตัวนี้ไปใช้งานบน iPhone อีกด้วย แต่โชคไม่ดีที่แม้จะทำตามคำแนะนำแล้วก็ยังไม่สำเร็จอยู่ดี&lt;br /&gt;&lt;br /&gt;หลังจากทำตามคำแนะนำแล้วโดน compiler ด่ามามากมาย วิธีป้องกันการโดนด่าให้ทำตามขั้นตอนต่อไปนี้&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;หมายเหตุ**&lt;/span&gt; ระหว่างทางอาจต้องตามหา &lt;a href="http://lloyd.github.com/yajl/"&gt;yajl&lt;/a&gt; และ &lt;a href="http://www.cmake.org/cmake/resources/software.html"&gt;CMake&lt;/a&gt; ด้วย&lt;br /&gt;&lt;br /&gt;1. หลังจากเราสร้าง iPhone app project เสร็จแล้ว ให้เปิดโปรเจ็คตัวอย่างที่ได้มาแล้วลาก folder ชื่อ MGTwitterEngine มาวางไว้ในโปเจคที่จะใช้ library ตัวนี้&lt;br /&gt;&lt;br /&gt;2. กด alt+command+E จากนั้นใน tab General ให้เพิ่ม linked library ชื่อ libxml2.dylib เข้าไปในโปรเจ็ค&lt;br /&gt;&lt;br /&gt;3. เพิ่ม header search path เข้าไปดังนี้&lt;br /&gt;&lt;b style="color: #274e13;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;$SDKROOT/usr/include/libxml2 &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;4. เอาไฟล์ที่อยู่ใน /usr/local/include/yajl/ ทั้งหมดมาวางไว้ในโปรเจ็ค&lt;br /&gt;&lt;br /&gt;5. download ไฟล์นี้ &lt;a href="https://rel.me.s3.amazonaws.com/yajl/libYAJLIPhone-0.2.2.zip"&gt;compiled YAJL static library for iPhone&lt;/a&gt; จากนั้น extract เลือกเอาไฟล์ชื่อ libYAJLIPhone.a มาใส่ใน Frameworks ของเรา&lt;br /&gt;&lt;br /&gt;6. ลอง compile และรันโปรเจ็ค จะพบว่าโดนด่ากลับมามากมาย ข้อหาไม่รู้จัก &lt;span style="color: #274e13; font-family: 'Courier New', Courier, monospace;"&gt;&amp;lt;yajlyajl_parse.h&amp;gt;&lt;/span&gt; ให้เราตามไปที่เกิด error ขึ้นแล้วแก้เป็น &lt;b style="color: #274e13;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;"yajl_parse.h"&lt;/span&gt;&lt;/b&gt; จากนั้นทดลอง compile แล้วรันใหม่&lt;br /&gt;&lt;br /&gt;7. โดนด่ากลับมาอีกรอบ แต่คราวนี้แค่ 2 ที่ เกี่ยวกับการใช้ yajl_alloc ว่าเราใส่ arguments ไม่ถูกต้อง ให้เราตามไปที่ error แล้วแก้จาก&lt;br /&gt;&lt;div style="color: #274e13; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;_handle = yajl_alloc(&amp;amp;callbacks, &amp;amp;cfg, self);&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เป็น&lt;br /&gt;&lt;div style="color: #274e13; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;_handle = yajl_alloc(&amp;amp;callbacks, &amp;amp;cfg, nil, self);&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;และแก้จาก&lt;br /&gt;&lt;div style="color: #274e13; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;yajl_free_error(errorMessage);&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เป็น&lt;br /&gt;&lt;div style="color: #274e13; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;yajl_free_error(nil, errorMessage);&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;8. เปิดไฟล์ MGTwitterEngineGlobalHeader.h ให้แก้&lt;br /&gt;&lt;div style="color: #274e13; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;#define YAJL_AVAILABLE 0&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;เป็น&lt;br /&gt;&lt;div style="color: #274e13; font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;&lt;b&gt;#define YAJL_AVAILABLE 1&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;9. ทำตาม code ตัวอย่างที่ MGTwitterEngine มาลองทำตาม โดยกำหนด MGTwitterEngineDelegate และ implement delegate method ของมันให้เรียบร้อย จากนั้นลองส่ง tweet ดูพบว่า&lt;a href="http://twitter.com/khomkrit/status/5614867505"&gt;ใช้งานได้แล้ว&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;ที่มา: &lt;a href="http://damienh.org/2009/06/20/setting-up-mgtwitterengine-with-yajl-106-for-iphone-development/?dsq=12190531#comment-12190531"&gt;Setting up MGTwitterEngine with YAJL 1.0.6 for iPhone development&lt;/a&gt;&lt;br /&gt;อาจต้องการ: &lt;a href="http://stackoverflow.com/questions/1338496/mgtwitterengine-for-iphone-sdk-errors"&gt;MGTwitterEngine for Iphone SDK errors&lt;/a&gt;, &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-2546095058949947715?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/2546095058949947715/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2009/11/mgttwitterengine-twitter-client.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2546095058949947715'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/2546095058949947715'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2009/11/mgttwitterengine-twitter-client.html' title='ใช้ MGTwitterEngine ทำ twitter client บน iPhone'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-760645740062104562</id><published>2009-11-09T20:22:00.001+07:00</published><updated>2009-11-09T20:24:26.464+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tip'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>ใช้ Hex value กำหนดค่าสีให้ UIColor</title><content type='html'>&lt;div class="rotilinks"&gt;การกำหนดสีให้กับ &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;UIColor&lt;/span&gt; เพื่อใช้งานในโปรแกรม สามารถทำได้ผ่าน method ต่างๆที่กำหนดไว้ในคลาส &lt;a href="http://developer.apple.com/iphone/library/DOCUMENTATION/UIKit/Reference/UIColor_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006892-CH3-SW11"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;UIColor&lt;/span&gt;&lt;/a&gt;&amp;nbsp;ซึ่งมีบางสีเราสามารถสร้างขึ้นมาได้เลยผ่าน Class Methods ที่ &lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;UIColor&lt;/span&gt; มีไว้ให้ เช่น&amp;nbsp;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 11px;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;a href="http://developer.apple.com/iphone/library/DOCUMENTATION/UIKit/Reference/UIColor_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006892-CH3-SW25" id="tocEntry_24" style="color: #4f4f4f; text-decoration: none;"&gt;greenColor&lt;/a&gt;,&amp;nbsp;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 11px;"&gt;&lt;a href="http://developer.apple.com/iphone/library/DOCUMENTATION/UIKit/Reference/UIColor_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006892-CH3-SW24" id="tocEntry_31" style="color: #4f4f4f; text-decoration: underline;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;redColor&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Arial, Helvetica, sans-serif;"&gt;และ&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif; font-size: 11px;"&gt;&amp;nbsp;&lt;a href="http://developer.apple.com/iphone/library/DOCUMENTATION/UIKit/Reference/UIColor_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40006892-CH3-SW26" id="tocEntry_12" style="color: #4f4f4f; text-decoration: none;"&gt;&lt;span style="font-size: medium;"&gt;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;blueColor&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;span style="font-family: Times; font-size: medium;"&gt;และแน่นอนว่าไม่ได้มี method สำหรับหลายๆสีที่เราต้องการในโลกของ RGB&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;method ชื่อ&amp;nbsp;&lt;span style="font-family: 'Courier New', Courier, monospace;"&gt;&lt;span style="color: #274e13;"&gt;colorWithRed:green:blue:alpha&lt;/span&gt;:&lt;/span&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt; ช่วยให้เรากำหนดค่าสี RGB และ Alpha เองได้ตามต้องการ แต่ใน API Reference กำหนดไว้ว่าให้กำหนดค่าสีเป็น&amp;nbsp;&lt;span style="font-family: monaco, courier, monospace; font-size: 11px;"&gt;CGFloat&lt;/span&gt;&lt;span style="font-family: inherit;"&gt; ที่สามารถกำหนดค่าได้ตั้งแต่ 0.0 ถึง 1.0 เท่านั้น (กำหนดมากหรือน้อยกว่านั้นก็ได้ แต่จะถูกปัดให้เป็น 0.0 หรือ 1.0 อยู่ดี) ซึ่งบางคนอาจคุ้นเคยกับการกำหนดค่าสี RGB ในรูปของเลขฐานสิบหกมากกว่า&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;อีกวิธีสำหรับคนที่เคยชินกับการกำหนดสีโดยใช้เลขฐานสิบหาคือ สร้าง macro ดังนี้&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: 'Lucida Grande', Geneva, Helvetica, Arial, sans-serif;"&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;pre class="jive-pre" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: initial; background-image: url(http://discussions.apple.com/images/quote-background-1.gif); background-position: initial initial; background-repeat: initial; border-bottom-color: rgb(238, 238, 238); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(238, 238, 238); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(238, 238, 238); border-top-style: solid; border-top-width: 1px; font-size: 1em; font-style: normal; font-weight: normal; margin-bottom: 0.5em; margin-left: 2em; margin-right: 2em; margin-top: 1em; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 1em; padding-right: 10px; padding-top: 10px;"&gt;&lt;code class="jive-code jive-java" style="font-size: 1em; font-style: normal; font-weight: normal;"&gt;#define HEXCOLOR(c) [UIColor colorWithRed:((c&amp;gt;&amp;gt;24)&amp;amp;0xFF)/255.0 \&lt;br /&gt;                                    green:((c&amp;gt;&amp;gt;16)&amp;amp;0xFF)/255.0 \&lt;br /&gt;                                     blue:((c&amp;gt;&amp;gt;8)&amp;amp;0xFF)/255.0 \&lt;br /&gt;                                    alpha:((c)&amp;amp;0xFF)/255.0];&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;เวลาใช้งานก็แค่&lt;br /&gt;&lt;span style="border-collapse: collapse; color: #333333; font-family: 'Lucida Grande', Geneva, Arial, Verdana, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="jive-pre" style="-webkit-background-clip: initial; -webkit-background-origin: initial; background-attachment: initial; background-color: initial; background-image: url(http://discussions.apple.com/images/quote-background-1.gif); background-position: initial initial; background-repeat: initial; border-bottom-color: rgb(238, 238, 238); border-bottom-style: solid; border-bottom-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-width: 2px; border-right-color: rgb(238, 238, 238); border-right-style: solid; border-right-width: 1px; border-top-color: rgb(238, 238, 238); border-top-style: solid; border-top-width: 1px; font-size: 1em; font-style: normal; font-weight: normal; margin-bottom: 0.5em; margin-left: 2em; margin-right: 2em; margin-top: 1em; overflow-x: auto; overflow-y: auto; padding-bottom: 10px; padding-left: 1em; padding-right: 10px; padding-top: 10px;"&gt;&lt;code class="jive-code jive-java" style="font-size: 1em; font-style: normal; font-weight: normal;"&gt;UIColor* c = HEXCOLOR(0xff00ffff);&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;เท่านั้นเอง&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Related Link from &lt;a href="http://roti.me/"&gt;&lt;b&gt;Roti&lt;/b&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2157525628671146945-760645740062104562?l=www.khomkrit.net' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.khomkrit.net/feeds/760645740062104562/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.khomkrit.net/2009/11/hex-value-uicolor.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/760645740062104562'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2157525628671146945/posts/default/760645740062104562'/><link rel='alternate' type='text/html' href='http://www.khomkrit.net/2009/11/hex-value-uicolor.html' title='ใช้ Hex value กำหนดค่าสีให้ UIColor'/><author><name>@khomkrit</name><uri>http://www.blogger.com/profile/02815244407449425185</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='21' height='32' src='http://4.bp.blogspot.com/-zUJfDxnKLhc/Ti4eBHmXCxI/AAAAAAAADfw/N-B1TBKRppI/s220/photo.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2157525628671146945.post-1954092985344374838</id><published>2009-10-29T18:20:00.003+07:00</published><updated>2009-10-30T22:04:34.136+07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='tutorial'/><category scheme='http://www.blogger.com/atom/ns#' term='cocoa'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='objective-c'/><title type='text'>เปลี่ยนไปแสดงหน้า view อื่นด้วย modal view</title><content type='html'>&lt;div class="rotilinks"&gt;คราวนี้ก็เป็นการเขียนโปรแกรมใน iPhone เหมือนครั้งก่อน :)&lt;br /&gt;&lt;br /&gt;การแสดง view อื่นๆทับ view ที่เรากำลังดูอยู่เพื่อทำอะไรบางอย่าง จากนั้นเราก็ปิดมันไป พฤติกรรมแบบนี้เรามักพบการนำไปใช้ในลักษณะของการที่ผู้ใช้ต้องการตั้งค่าอะไรบางอย่างเล็กน้อย หรือไม่ก็เป็นการแสดง credit หรือบอกเกี่ยวกับ (About) application นั้นๆ&lt;br /&gt;&lt;br /&gt;เริ่มกันเลย&lt;br /&gt;ขั้นตอนหลักๆที่จะทำกันก็คือ&lt;br /&gt;1. สร้าง view และ controller ของมันขั้นมา 2 อัน ซึ่งอันหนึ่งจะเป็น view หลัก และอีกอันหนึ่งจะเป็นหน้าที่เราใช้เป็น modal view&lt;br /&gt;2. ใส่ปุ่มให้กับทั้ง 2 view ที่เราสร้างไปในข้อ 1 และกำหนด event ให้ว่า เมื่อทำการ click แล้ให้สลับเอาอีก view หนึ่งมาแสดง หรือเอา view ที่กำลังแสดงอยู่ออกไป&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;เรามาเริ่มที่ขั้นแรกกันก่อน&lt;br /&gt;ด้วยการสร้างโปรเจ็คเป็น Window-based Application จากนั้นสร้าง UIViewController subclass ขึ้นมา 2 อัน อันแรกให้ชื่อ RootController อันที่สอให้ชื่อ ModalViewController&lt;br /&gt;&lt;br /&gt;เปิดไฟล์ MainWindow.xib ขึ้นมา แล้วลาก View Controller จาก Library มาวางไว้ในหน้าต่าง MainWindow.xib พร้อมทั้งลาก View เข้ามาเป็นลูกของ View Controller แต่ละอันด้วย&lt;br /&gt;&lt;br /&gt;จากนั้นกำหนด class ให้ View Controller แต่ละอันเป็น RootController และ ModalViewController ตามลำดับ &lt;br /&gt;&lt;br /&gt;ถึงตรงนี้เราจะได้ดังรูปด้านล่างนี้&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_3fuqAEHAG_Q/Sulx-irii1I/AAAAAAAADT8/fP4PhNqrPD8/s1600-h/Picture+1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_3fuqAEHAG_Q/Sulx-irii1I/AAAAAAAADT8/fP4PhNqrPD8/s320/Picture+1.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;จากนั้นสร้างตกแต่ง view ของทั้ง 2 controller โดยให้แต่ละ View มีปุ่มกดอย่างน้อย 1 ปุ่มแปะอยู่ด้วย&lt;br /&gt;&lt;br /&gt;ขั้นที่ 2 ก็คือการให้มันรับรู้ว่าหากกดปุ่มแล้วให้ทำอะไร&lt;br /&gt;หลังจากเรามีปุ่มบน view ทั้ง 2 แล้วให้เปิดไฟล์ ModalViewAppDelegate.h ขึ้นมาและเพิ่ม outlet ดังนี้&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IBOutlet ModalViewController *modalViewController;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IBOutlet RootController *rootController;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;และประกาศ action method ขึ้นมาอีก 2 ตัว สำหรับการแสดง และซ่อน modal view&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- (IBAction) showModalView: (id) sender;&lt;br /&gt;- (IBAction) hideModalView: (id) sender;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;ถึงตรงนี้อย่าลืม import class ทั้งสองที่เราประกาศว่าจะใช้งานมันด้วยล่ะ&lt;br /&gt;&lt;br /&gt;เมื่อเขียน interface เรียบร้อยแล้วก็ตามเข้าไปในไฟล์ ModalViewAppDelegate.m เพื่อ implement method ทั้ง 2 ต่อดังนี้&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;- (IBAction) showModalView: (id) sender{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [rootController presentModalViewController:modalViewController animated:YES];&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote&gt;- (IBAction) hideModalView: (id) sender{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; [rootController dismissModalViewControllerAnimated:YES];&lt;br /&gt;}&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;ถึงตรงนี้ก็เสร็จเรียบร้อย ซึ่งจะสังเกตได้ว่างเราเขียน code ในแต่ละ action แค่อย่างละบรรทัดเท่านั้นเอง!&lt;br /&gt;&lt;br /&gt;ขั้นตอนต่อไปก็ถึงคราวต้องเชื่อมส่วนต่างๆเข้าด้วยกัน โดยลากเชื่อม rootController และ modalViewController ที่ประกาศไว้ใน ModalViewAppDelegate.h เชื่อมเข้ากับ view controller ของแต่ละอัน และลากปุ่มแต่ละปุ่มในแต่ละ view ที่เราสร้างไว้ เชื่อเข้ากับ method ที่เราประกาศไว้ใน ModalViewAppDelegate เช่นกัน&lt;br /&gt;&lt;br /&gt;ถึงตรงนี้เราจะได้ดังรูปด้านล่าง&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_3fuqAEHAG_Q/Sul2LaV5J_I/AAAAAAAADUE/gXkJBQVGWwE/s1600-h/Picture+2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_3fuqAEHAG_Q/Sul2LaV5J_I/AAAAAAAADUE/gXkJBQVGWwE/s320/Picture+2.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;เมื่อทำเสร็จแล้ว ก็ทดลองสั่งรันเล่นได้เลย เราจะเห็นว่าหน้าต่าง modal view จะแสดงโดยการเลื่อนขึ้นมาจากด้านล่างเมื่อเรากดปุ่มในหน้าแรก และหากดปุ่มอีกทีในหน้า modal view มันก็จะเลื่อนกลับลงไปอย่างสวยงาม &lt;br /&gt;&lt;br /&gt;transition สำหรับการแสดง modal view นั้นหลักๆที่มีใน standard library นั้นมีด้วยกัน 3 แบบคือ&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;UIModalTransitionStyleCoverVertical&lt;br /&gt;UIModalTransitionStyleFlipHorizontal&lt;br /&gt;UIModalTransitionStyleCrossDissolve&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;แบบแรกเป็นการเลื่อนจากล่างขึ้นบน และจากบนลงล่างตอนเราสั่งปิดมัน&lt;br /&gt;แบบที่สองเป็นการ flip หน้าจอ เหมือนพลิกไปด้านหลังของ view และพลิกกลับหากเราสั่งปิดมัน&lt;br /&gt;แบบที่สาม modal view จะค่อยๆชั
