利用 Network Framework 輕易監控網路狀態變化
大家好,歡迎閱讀本次教學。毫無疑問,所有與伺服器交換資料的 App,都需要知道一件事情:它們是否已連接到網路。當處於離線時,我們通常需要更改使用者體驗,並更新使用者介面,以反映出 App 無法執行網路操作。此外,即使 App 已經連上了網路,我們還是需要了解連線的類型(像是無線網路或行動網路)。沒有人會想在不知情的情況下,使用一個以行動網路讀取大量資料的...
View ArticleSwiftUI & PromiseKit:讓 Alert 樣式統一又可復用 打破彈出視窗的惡夢
開發 iOS 的過程中,常常會有彈出 Alert 讓使用者選擇的需求,又需要知道使用者選擇了哪一個,卻遇到各種彈出都要一直callback callback 嗎?每次選項都很難掌握,多個選項還要自行客製化,也很難復用,只能一個畫面刻一個? 在本篇教學文章中,我們會了解到幾個要點並實作: 建立統一入口 Alert 服務化,讓任何地方需要顯示與選擇時,都能輕易掌握使用呼叫。 客製化領域設計選項...
View ArticleSwiftUI 小技巧:利用 Stack 簡單構建彈性的卡片視圖
歡迎閱讀 SwiftUI 小技巧系列教程!在這篇文章中,我們將實作一個常見的手機 UI 設計 —— Card UI。SwiftUI 框架讓我們輕易構建 App UI,我們會在文章中展示這一點。你將會看到我們可以使用堆疊 (stack)、圖像、和文本視圖,來像這樣創建卡片視圖 (card view)。 請注意,本篇教程需要你在 macOS Catalina (v10.15)上運行 Xcode 11。...
View ArticleCompositional Layout 詳解 讓你簡單操作 CollectionView!
隨著手機 App 介面和硬體的不斷進化,現在 App 介面的複雜度已經跟以往不能同日而語了。以前的 UI 可能就是一個簡單的 TabelView,把所有資訊都一視同仁地列出來,上面也不太會有甚麼複雜的互動,就程式的撰寫上,一個或兩個 UICollectionView 就有辦法滿足大部份的需求。還記得很久以前的 AppStore 嗎?它就是一個簡單的列表,沒有任何花俏的功能。 2008 年的...
View Article利用 CocoaPods 及 GitHub 一步步創建可重用的函式庫!
歡迎回到我們的教學系列文章!在上一篇教學文章中,你學到了如何使用 Network 框架來偵測及監控網路狀態。看來這個框架在 NetStatus 類別中運行得相當不錯,所以讓我們更進一步,來創建一個基於 NetStatus 類別的小型、開源框架吧!在本篇教學中,我們將透過 CocoaPods 來創建一個 pod,讓這個框架容易發佈及整合,並把它推送到 GitHub 上。 要在多個專案中重複使用...
View Article詳解 Swift 各種 Type Polymorphism 找出最適合的實作方式!
Polymorphism (多型)是程式設計的基本概念之一,指同一個介面的背後可以有不同的實作。比如說在 UIKit 裡面的 UIImage,它的底層實作可能是 Core Image,也可能是 Core Graphics,但我們在 call site 通常不需要在意這些。另一個例子是 Swift 的 String,它的底層可能是 Swift 原生的也可能是從 NSString...
View ArticleViewController 轉場初階指南:簡單打造酷炫的轉場動畫
今天,我們會客製由一個視圖控制器 (ViewController) 轉場到另一個的轉場動畫。 為什麼會想要寫這個主題呢?過去,我花了很多時間去了解視圖控制器之間的轉換。遺憾的是,目前線上鮮有能簡單說明視圖控制器動畫轉場的教程。 因此,我決定寫幾篇文章,教大家用最簡單的方法,創建令人驚艷的轉場動畫。 讓我們開始來創建客製化的 UINavigationController 轉場動畫吧!...
View ArticleViewController 轉場進階指南:進一步創建絢麗的轉場動畫
今天,我們會客製由一個視圖控制器 (ViewController) 轉場到另一個的轉場動畫。 為什麼會想要寫這個主題呢?過去,我花了很多時間去了解視圖控制器之間的轉換。遺憾的是,目前線上鮮有能簡單說明視圖控制器動畫轉場的教程。 因此,我決定寫幾篇文章,教大家用最簡單的方法,創建令人驚艷的轉場動畫。而這篇文章會比前一篇更進階。 讓我們開始來創建客製化的 UINavigationController...
View Article用 Swift 實作 Smalltalk MVC 大幅減少資料流的複雜度!
在 Apple 開發圈,我們都很熟悉所謂的 MVC 設計模式:把整個程式裡的物件分成 Model、View 與 Controller 三種不同的角色,讓它們分別負責解決不同的問題。Model 物件專責資料的封裝與相關的基礎行為,View 物件代表使用者看得到的介面元件,而 Controller 物件負責把 Model 物件與 View 物件連結在一起(參考資料:Apple Developer...
View Article善用 Static Factory Method 重構程式碼 讓它更流暢好讀!
在使用一個物件之前,我們經常會需要對其進行設定。比如說,使用一個 UIView 之前,有時我們會需要指定它的背景色彩等屬性: 這些設定程式碼跟其它的邏輯程式碼是相當不同的存在。它們往往只跟被設定的那個物件有關,像這裡就是只跟 view 有關,跟 ViewController 無關。所以,要重構它們也是相對上簡單的。比如說,我們可以直接把它們包裝成一個 ⋯⋯ 自由函數工廠方法 我們把工廠方法寫成一個...
View Article簡單解決 Xcode 11.3 的 Bug:無法把間距約束設為零?
如果你已經把 Xcode 升級到 11.3 版本,你會發現當你使用 Interface Builder 創建 App UI 時,無法將間距約束條件 (spacing constraints) 的值設置為零。你可以打開 Interface Builder,然後點擊 “Add new constraints” 來試試看,將其中一個約束條件設置為 0 後,它卻自動將其恢復為 standard。...
View ArticleSwiftUI 教學:認識手勢 (Gestures) 和 @GestureState
如果你曾試過使用 SwiftUI 框架,你可能已對手勢操作有初步認識。最常見的,就是用 onTapGesture 修飾器來處理使用者的觸控並做出相對的回應。此教學,我們將會深入來看如何在 SwiftUI 中處理不同的手勢。 這個框架提供幾個內建手勢,像是之前用過的點按 (tap) 手勢。不止這些,還有像 DragGesture、 MagnificationGesture 與...
View ArticleSwift Package 實用指南 讓你有效率地重複使用元件!
歡迎來到新的教學文章,我將會告訴你建立自己的 Swift packages 的實作方式。Swift Packages 包含了不同的程式碼,不管是能夠在專案內重複使用的、能分享給其他開發者的、及可以作為專案的相依套件 (dependency) 的。自 Xcode 11 起,Apple 已經把建立及管理 Swift Package 的功能整合進 Xcode 中,讓開發者得以快速並直接地處理這些過程。...
View ArticleiOS App 環境管理 : 靈活運用 Xcode Scheme、GitLab 和 Fastlane 設置不同的開發環境
真正產品化的 App,通常都有不同的環境與配置,包括環境資訊與後端不同環境的位置,上線後測試功能分流,一般實驗時可以很容易上手 CI/CD,但在實戰中可能需要更加複雜且靈活的設置。讓我們來看看,這些配置在實戰中是甚麼樣子!你可以在這裡參考原始碼。 在專案準備中,我們使用 GitLab 來實作。我們透過 GitLab CI/CD,完成產品 App 中的 CI/CD Pipeline...
View ArticleSwiftUI 教學:運用不同 UI 元件 輕鬆建立一個電影預告片 App
Apple 在 WWDC19 介紹了最新的開發框架,其中之一就是 SwiftUI 以及 Combine。如果你還沒有知道這個消息,簡單來說,SwiftUI 是一種新的方法,讓我們可以藉由宣告方式來創建 UI;而 Combine 是與它一起使用的,Combine 提供了宣告式 Swift API,以處理像是 UI 或是 Network 事件的值。 如果你是剛接觸...
View Article簡單解釋 Any 與 AnyObject 的差別 讓你快速掌握這兩個概念!
每次編寫程式碼時,我們都會處理實例 (instance) 或類型 (type)。在非特定型別的情況下,我們會選擇 Any 或 AnyObject。 Any 和 AnyObject 的差別 Any:它可以代表任何型別的類別 (class)、結構 (struct)、列舉 (enum),包括函式和可選型別,基本上可以說是任何東西。 AnyObject:它指的是類別的任何實例。這只在使用參考型別...
View Article在 Swift 利用 Forward Pipe Operator 達成複雜的自動化流程!
在類 Unix 系統的終端機 shell 裡,有一個功能叫做管線 (pipeline),可以把A程式的輸出口與 B 程式的輸入口串接起來,使 A 與 B 變成連動的程式。 比如說,我們可以把 ls -al(把當前資料夾底下全部的檔案用列表方式列出來)跟 less(具備上下捲動功能的閱讀器)用管線串在一起,就可以用 less 去閱讀檔案列表了: 在這行命令當中,|...
View ArticleiOS 13 Dark Mode 教學:為 App 配置 Dark Mode 讓使用者體驗更進一步
簡介 我想你都已經聽說過 iOS 13 的深色模式 (Dark Mode),就是使用者介面顏色變暗的模式。這可以改善光線不足時的可見性,並減少 App 的能源消耗(深色消耗的電量少於淺色)。 雖然某些 App 已經在介面中包含了深色模式,但是直到發佈 iOS 13 和 iPadOS 後,深色模式才被放進裝置本身的配置中。要更改為深色模式,我們要到設定 > 螢幕與亮度,然後選擇深色。 配置...
View Article淺談回應鏈 (Responder Chain) 讓你認識這個靈活又實用的設計模式!
在 UIKit 當中負責處理使用者動作的東西,叫做回應鏈 (Responder Chain)。回應鏈是由許多部件一起組成的一個複合元件,包括 view、view controller、window、application 等等。這些元件經由單向鏈結串列 (singly linked list)...
View ArticleSwift 教學:認識 Higher Order Functions 高階函數(Reduce 和 FlatMap)
歡迎來到這篇有趣的新程式教學文章!Swift 是種富含多種特性的語言,當中有一個不能錯過的良好特性,就是高階函數 (higher order functions)。根據 Wikipedia 上面的解釋所描述: 在數學和計算機科學中,高階函數是至少滿足下列其中一個條件的函數: - 接受一個或多個函數作為輸入- 輸出一個函數 所有其他函數皆為一階函數...
View Article