[CS193P] 第十四堂課摘要及心得筆記

在這一次的課堂上,我們將學習在iPhone開發平台上關於觸控事件的處理,而多點觸控的功能更是iPhone應用程式開發的重點,就讓我們一起來看看吧!
評論
評論

在這一次的課堂上,我們將學習在 iPhone 開發平台上關於觸控事件的處理,而多點觸控的功能更是 iPhone 應用程式開發的重點,就讓我們一起來看看吧!

觸控的序列

在 iPhone 的操作上面,像是如下圖般一筆劃的觸控動作,會被轉成一系列的 UITouch 物件,儲存在 UIEvent 之後傳遞給 view。

UITouch 物件描述了某支手指頭在觸控螢幕上得動作,包含以下這些屬性:

@property(nonatomic,readonly) NSTimeInterval	timestamp; // 觸控的時間點 @property(nonatomic,readonly) UITouchPhase	phase; // 觸控中的哪一階段(後面會有敘述) @property(nonatomic,readonly) NSUInteger	tapCount; // 連續點了幾下 @property(nonatomic,readonly,retain) UIWindow	*window; // 在哪個 Window 上點擊 @property(nonatomic,readonly,retain) UIView	*view; // 在哪個 View 上點擊 - (CGPoint)locationInView:(UIView *)view; // 在某個 view 上的座標位置 - (CGPoint)previousLocationInView:(UIView *)view; // 在某個 view 上的前一個座標位置

而 UIEvent 如同我們剛剛所提及的,是 UITouch 的容器,當我們有多點觸控的時候,這個容器就會包含數個 UITouch 物件。UIEvent 具有以下類別:

@property(nonatomic,readonly) NSTimeInterval timestamp; // 觸控的時間點 - (NSSet *)allTouches; // 所有的 UITouch 物件 - (NSSet *)touchesForWindow:(UIWindow *)window; // 回傳某個 windows 上的 UITouch 物件 - (NSSet *)touchesForView:(UIView *)view; // 回傳某個 view 上的 UITouch 物件

而以上這些物件均會傳透過 UIResponder 的方法傳遞給我們的應用程式,包含以下幾個方法:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; // 觸控開始 - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; // 觸控點移動中 - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; // 觸控結束 - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event; // 觸控取消

上面所謂的觸控取消,雖然僅會發生在很少的機會,像是忽然接到來電,但仍然不能忘記對這些物件進行處理,詳細的原因在課堂的稍後會在做解釋。

多點觸控

在我們要開始接收包含多個 UITouch 的 UIEvent 物件之前,我們必須先將 UIView 的 BOOL multipleTouchEnabled; 屬性設定成 YES 才行。

而當使用者若同時將兩隻手指放在 iPhone 上時、或者是兩隻手指頭同時在螢幕上移動時,我們就會接收到包含多個 UITouch 物件的 UIEvent。但需要注意的是,如果使用者將兩隻手指同時放在畫面上,但只有一個手指在移動,這樣我們所接收到的 UIEvent 物件只會包含在移動中的 UITouch 物件!

而若是兩隻手指分別在不同的 View 上呢?那兩個 View 分別會接收到 touchesMoved: withEvent: 的呼叫,並且除了自己 view 上的 UITouch 物件之外,也會收到另外一個 View 上得 UITouch 物件。

然而,有時候我們不希望使用者可以同時操作兩個 UIView 物件,特別是我們在開發遊戲的時候,我們可能會禁止使用者同時移動並且開火,這時候我們就可以設定 UIVIew 中的 BOOL exclusiveTouch; 屬性為 YES,這樣一來就可以避免同時有兩個以上的 View 接收到 UIEvent 物件了。

或許當讀者看到上面的方法會感到好奇,那 iPhone 是如何判斷某個 Touch 是屬於哪個 View 呢?事實上,iPhone 會透過呼叫 hitTest:withEvent: 這個測試方法,測試 UIWindow 上的每一個 view 是否符合以下三個條件:

  • userInteractionEnabled 屬性是否為 YES
  • hidden 是否為 YES,或是 alpha 設定在一個很低的數字(也就是透明)
  • 透過呼叫 pointInside:withEvent: 檢查觸控點是不是在 view 的範圍內

當某個 UIView 符合以上條件的話,iPhone 就會繼續測試其底下所包含的 subviews,直到找到最適合的 view 為止。

而當找到 View 之後,會對其 UIViewController 呼叫 (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 等方法傳遞 UIEvent 物件。但若是最底層的 View 沒有實做這個方法回應觸控事件的話,則會往 superview 傳遞 UIEvent 物件。然後重複這個循環,直到找到可以回應觸控事件的 View 為止,而若是所有的 superview 對於目前的 UIEvent 物件沒有處理的話,則會轉而呼叫 UIWindow 甚至是 UIApplication 進行處理。整體的階層架構如下圖:

最佳作法

iPhone 開發平台釋出也有一段時間了,隨著越來越多的應用程式開發完成,開發者們也對於觸控事件有一些常見的錯誤及解決方法,以下就是幾個常見的開發好習慣:

當某個 View 被 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event; 方法回傳,也就代表他應該要處理所有的觸控事件,包含以下四個:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

由於大多數的觸控處理都會暫時將 UIEvent 儲存起來以跟後續的觸控行為進行比對、計算,而如果我們漏掉處理其中某一種(特別是觸控取消時),就很有可能造成物件產生無法預期的錯誤。

而當我們需要繼承 UIView 建立自己的 View 類別時,也必須遵守以上的慣例,也就是處理每一個階段的觸控事件。而且要注意,在這些處理方法中千萬不能向上呼叫父類別的處理方法。

至於若是繼承其他 UIKit 的類別,像是 UIButton 時,你可以選擇處理某些觸控事件即可,但是跟上面相反的是,你必須在每個觸控事件處理方法呼叫父類別的相對方法,否則物件原有的觸控反應將會無效。

最後,如果你萬不得已,非得需要將某個觸控事件轉移給別的 View 的話,那要記得那些 View 必須是自己設計的 UIView 子類別,因為 UIKit 內建的類別並不保證可以在這樣的狀況下正確運作。

結論

相信各位讀者應該在這次的課程中,對於觸控的事件處理有很詳細的了解,也已經可以透過這些知識設計出多點觸控的應用程式了!在下一次的課程中,我們將探討那些在 iPhone SDK 中所附的模擬器中無法測試的硬體功能,像是羅盤、GPS 或者是加速度計等等,請繼續鎖定本連載!

參考資源


疫情促數位轉型,資策會用 STEPS 方法論助產業無痛升級

面對疫情期間面臨消費者行為的改變、電子商務侵蝕實體零售服務業的市場等態勢,台灣中小企業、零售業和實體通路品牌,必須加速數位轉型腳步,才能繼續保有競爭力!
評論
Photo Credit:unsplash
評論

COVID─19 疫情讓全球產業界都受到嚴重衝擊,而台灣自 5 月中旬啟動三級警戒後,首當其衝的當屬零售服務業、教育產業、旅遊觀光等,企業界體認「數位轉型」趨勢已然成形的事實。而顧問公司 KPMG 亦指出,台灣有超過 40% 的執行長認為,疫情會加速企業數位轉型的步伐。在防疫期間,消費者亦會更加普遍地使用數位通路;因此,具備數位營運能力已成為公司營運的基本功。

本文專訪有 10 多年產業研究及數位輔導經驗的資策會創生服務處跨域共創中心主任張為詩,分享哪些產業最需要做數位轉型?究竟企業做數位轉型會面臨到何種困難?執行數位轉型有何成功的秘訣?

針對上述疑問,張為詩指出,在疫情爆發之前,談到「數位轉型」這件事,比較像是企業內部的口號,某些人以為,把公司內部流程數位化,就是「數位轉型」,甚至部分業者認為導入 AI 等新興科技就算完成數位轉型。去年全球疫情爆發,台灣卻仍如常上班上課,企業對於數位轉型便無迫切需求。反觀,今年 5 月中旬爆發本土疫情後,許多企業便意識到「數位轉型」是一件非做不可的事。

「這段期間發生的問題,是以前從未想像過的。比方說遠距教學,從前只在偏鄉教育裡推動,但現在每間學校、每個老師和學生都要使用遠距教學,甚至連同泛教育體系的各式補習班如插大、研究所、高普考等,也必須有所改變。另外像是研討會、工作坊這些著重現場感的會議,現在都必須要改成線上進行,甚至如『線上展會』,完成一套模擬的線上商品展也是需要投資的,但現在若不做這樣的投資,客戶就完全看不到你的東西」,張為詩說,「疫情讓民眾的生活型態完全改變,連帶使『零接觸經濟』蓬勃發展」。

STEPS 五步驟 數位轉型方法論

企業主既然意識到「數位轉型」之不可不為,但究竟要如何去執行?他們大多沒有答案。而且,企業面臨數位轉型的最大難題即是缺乏專業人才,並且缺乏系統化的方法工具。對此,資策會在今(2021)年中出版《數位轉型進化論-step by STEPS》,以會內歸納出的 STEPS 數位轉型方法論架構,藉以系統化助企業拆解數位轉型的挑戰,並實際推動轉型案例經驗,輔助培育相關數位人才。

所謂「STEPS」即為 Survey(需求挖掘)、Target(擬定主題目標)、Engage(鏈結組隊)、Pilot(市場先導驗證)、Spread(服務廣度擴散)共 5個步驟。而創生處北中南各地的「RDTIH 區域數位轉型中心」,即應用此架構,並透過會內數位轉型顧問,來傳達數位轉型的重要性。

資策會數位轉型STEPS方法論。Photo Credit:財團法人資訊工業策進會

作為資策會第一線業務與地方智庫幕僚單位的創生服務處,去年底開始推動 RDTIH 區域數位轉型創新中心 (Regional Digital Transformation Innovation Hub),創生處主任張為詩說明,RDTIH 概念是來自歐盟 2016 年提出「數位創新中心(Digital Innovation Hubs, DIHs)」,主要是協助以一站式服務據點(one-stop-shop )的型式,提供企業所需知識、方法、軟體、技術平台、解決方案和測試設施及場域,與地方的產官學界合作,形成各地區的 Ecosystem 商業生態,協助中小企業轉型。

RDTIH 區域創新中心 扶植北中南特色產業善用數位工具

由於資策會創生處在北部、中部、南部都有辦公室,且北、中、南產業的主題特色各不相同,例如很多 AR/VR 業者都位於北部,因此北區 RDTIH 服務項目即以互動體感科技為主,提供業者們試驗與創新的場域。

而中區則是製造機械產業的重點聚落,其中又以自行車、DIY 手工具及水五金為主。因此中區 RDTIH 提供諮詢診斷、數據商情分析、商模規劃、科技導入測試、產業成果推廣,帶領中部產業進入數位高階製造及智慧運動觀光領域。

南部產業則包括扣件、金屬等傳統製造業,另外則有近期政策主推的 5G 文化、AIoT 產業等。南區 RDTIH 主要任務是運用 5G/AIoT 等智慧科技,推動南部產業數位轉型,打造南台灣數位轉型生態聚落,服務領域包含智慧製造、體感娛樂、運動娛樂、智慧醫療等多方位業務,同時也擔任區域產業調研專家與地方政府智庫幕僚。

資策會創生服務處跨域共創中心主任張為詩。Photo Credit:財團法人資訊工業策進會

飯店高層 尋求數位轉型方向

創生處 RDTIH 的數位顧問在協助企業做數位轉型時,曾發現不少有趣案例。張為詩舉國內某家飯店集團為例,這家飯店的老闆在疫情期間仍需出國考察,入境後需要隔離,這期間他每天都滑 FB,看到各企業粉專的貼文,於是老闆覺得「小編」這個職務非常重要,要求行銷部立即處理。於是創生處便請了公關專業人士來幫這個集團所有的小編上課,為飯店品牌做正面的網路行銷。

後來這位飯店老闆又滑 FB 發現其他同業都已投入線上購物,他認為自家的商城也需要改進。而疫情期間訂房數明顯下降,空房率變高,這些空置的客房要如何行銷出去?老闆和高層主管們迫切想找到數位轉型的方向,資策會顧問以  STEPS 方法論,助其擬出智慧酒店的發展藍圖;也就是現在很夯的「無人旅店」,旅客從 Check in到進房門,都不需要看到真人,也能減少疫情期間人與人的接觸。

觀光樂園 借科技力量拉回顧客

另一個「觀光樂園」的案例,則是由於近年娛樂選擇趨於多元,主題樂園業者面臨來自觀光工廠及生態旅遊的競爭,迫使樂園業者力求轉型,借助科技力量讓原有設施產生更豐富的娛樂效果,成為主題樂園轉型的重要作法之一。

資策會創生處顧問團隊運用數位轉型方法論(STEPS),協助樂園業者規劃具備「沈浸娛樂體驗」、「群眾互動性」與「空間複合效益」等特色的商品,將 VR 海盜船/雲霄飛車、AR 摩天輪/咖啡杯、VR/AR 互動解謎/密室鬼屋等設施分門別類,最後選定以高互動程度及空間複合效益較大的「VR/AR 互動解謎與密室逃脫」為主題產品,達成強化科技娛樂體驗,並解決營運坪效和服務人力問題,進而提升入園人次與消費者再入園意願的目標。

哪些產業亟需數位轉型?

張為詩認為,數位化正在改變用戶的期望。用戶希望簡單、便捷及用戶良好的體驗,企業則需要重塑用戶參與模式。此外,所謂的競爭對手已經不僅僅是行業內,很有可能是其他的產業,而且這些對手可能是巨頭公司,且往往因新進入者的玩法不同,帶來不同的遊戲規則。

以最近興起的雲端廚房為例,張為詩分享,「過去餐飲業新創面臨前期投資門檻高,但後期回收速度慢,經常入不敷出,容易倒閉。雲端廚房只有廚房設施、廚師以及食材,運用外送平台或是自家外送服務提供餐點的營業模式,租金及其他間接成本可降低 25%,人事成本平均可減少 20%。甚至,陸續發展出包含共享廚房、品牌餐飲代工、自創品牌等新興商業模式,甚至讓雲端廚房變成新創加速器的角色。」

台灣目前亟需數位轉型的產業,不只有超過 100 萬家的中小企業,還有平常接觸最多消費者的零售服務業,疫情期間面臨消費者行為的改變,及電子商務正在侵蝕實體零售服務業的市場,因此,中小企業、零售業和實體通路品牌必須加速數位化腳步,才能繼續保有競爭力!