Swift程式設計[第2單元]: SwiftUI

#29 TapGesture: 輕點2次

這是本單元最後一節課。

TapGesture 是點按(或輕點、點選)的手勢操作,與滑鼠的點擊(Click)操作類似,也可以連續兩次點按,我們練習將表情符號(Emoji)改用 List 列表,然後讓每個表情符號可以點按一次則改變顏色,或點按兩次則放大並拷貝字元。

拷貝字元到剪貼簿的方法是借用舊有的 UIKit 一個物件UIPasteboard:
UIPasteboard.general.string = 符號.char
就會將符號字元拷貝到剪貼簿中。

範例程式如下,前半段用傑森解碼器讀取Emoji列表的程式碼跟範例程式2-8b是一樣的:
// 2-10c Emoji (TapGesture)
// Revised from 2-8b by Heman, 2021/08/26
import PlaygroundSupport
import SwiftUI

struct 表情符號: Codable {
var codes: String
var char: String
var name: String
var category: String
var group: String
var subgroup: String
}

func 傑森解碼器(_ 檔名: String) -> [表情符號]? {
if let 檔案 = Bundle.main.url(forResource: 檔名, withExtension: "") {
do {
let 資料 = try Data(contentsOf: 檔案)
let 結果 = try JSONDecoder().decode([表情符號].self, from: 資料)
return 結果
} catch {
print("error:\(error)")
}
}
return nil
}

let 表情符號全集 = 傑森解碼器("emoji.json") ?? []

struct 顯示表情: View {
@State var 點選 = false
@State var 放大 = false
var 符號: 表情符號
init(_ p: 表情符號) { 符號 = p }
var body: some View {
HStack {
Text(符號.char)
.font(.system(size: 放大 ? 96 : 36))
VStack(alignment: .leading) {
Text(符號.category)
Text(符號.name)
}
.lineLimit(1)
.font(放大 ? .title : .title2)
.foregroundColor(點選 ? .orange : .primary)
}
.onTapGesture(count: 2) {
UIPasteboard.general.string = 符號.char
放大.toggle()
}
.onTapGesture {
點選.toggle()
}
}
}

struct 顯示表情符號: View {
var body: some View {
List(表情符號全集, id: \.codes) {字符 in
顯示表情(字符)
}
}
}
PlaygroundPage.current.setLiveView(顯示表情符號())

執行結果畫面如下,點按一次則變成橙色,點按兩次則放大,並且將表情符號字元拷貝到剪貼簿:


實現這個操作的程式碼如下:
struct 顯示表情: View {
@State var 點選 = false
@State var 放大 = false
private var 符號: 表情符號
init(_ p: 表情符號) { 符號 = p }
var body: some View {
HStack {
Text(符號.char)
.font(.system(size: 放大 ? 96 : 36))
VStack(alignment: .leading) {
Text(符號.category)
Text(符號.name)
}
.lineLimit(1)
.font(放大 ? .title : .title2)
.foregroundColor(點選 ? .orange : .primary)
}
.onTapGesture(count: 2) {
UIPasteboard.general.string = 符號.char
放大.toggle()
}
.onTapGesture {
點選.toggle()
}
}
}

設定了兩個「狀態變數」,「點選」對應點按一次的手勢,「放大」對應點按兩次,如何得到點按兩次的訊號呢?就是 onTapGesture(count: 2) 加上參數即可,沒有加參數時,預設的 count 為 1,就是點按一次。

每個表情符號用 HStack + VStack 來呈現符號與名稱、類別,在最外的 HStack 加兩個手勢操作的修飾語:
        .onTapGesture(count: 2) {
UIPasteboard.general.string = 符號.char
放大.toggle()
}
.onTapGesture {
點選.toggle()
}

做法跟前2節介紹的一樣,都是藉由改變「狀態變數」來帶動畫面的變化。

執行的動態影片如下:
#30 第2單元結束

第2單元到此告一段落,兩個月的暑假生活也即將結束,希望大家跟筆者一樣,過了一個豐富且充實的暑假。

西元1665-1666年倫敦再次爆發黑死病疫情,當時22歲的牛頓剛從劍橋大學取得學位,因為疫情而離開倫敦回到鄉下家裡,就在這2年期間,牛頓潛心研究數學、光學與星體運動。奠定日後發展微積分、光譜與望遠鏡,以及三大運動定律及萬有引力定律的基礎。

雖然學習 Swift & SwiftUI 跟牛頓對現代科學的影響力無法相提並論,但同樣在疫情影響之下,讓我們多少可以領略當年牛頓的生活。

疫情改變了很多事情,其中之一是讓數位化更深入到現代生活每個層面,不論是網路課程、遠端醫療、數位金融....等,幾乎生活上能夠數位化的,在COVID-19期間,都得到充分的發展。

所以在這段時間學習 Swift & SwiftUI 是別具意義。

第2單元雖然告一段落,但筆者自己也覺得意猶未盡,並未將 SwiftUI 基礎全部講完,
所以第3單元可能不會按照原定計畫,純粹講平面繪圖(特別是 Shape 的部分),而是會混合一點第2單元沒講完的版面編排與控制元件的內容,這需要構思一段時間,預計9月下旬,差不多是新版 macOS, iOS 發表的時候,才會開始寫第3單元。

希望同學們對程式設計能夠繼續保持興趣,未來能寫自己的App,在數位化、網路化的世界貢獻自己一份心力。
Knights
[拇指向上]拍手
學完第2單元,已經具備圖形介面程式的基礎能力,能夠將資料加以視覺化呈現出來。

第3單元是Swift網路程式的基礎,讓我們可以利用網路上現成的素材資料,配合第2單元的視覺化,這樣就可以製作基本的網路互動App。

想繼續學習網路程式的朋友,可以前往以下連結:

Swift程式設計[第3單元]網路程式基礎 https://www.mobile01.com/topicdetail.php?f=482&t=6453587
雪白西丘斯 wrote:
#20 第7課 傑森(恕刪)


請問一下如果json檔是放在google drive或onedrive,靠app來下載它的話要怎麼做?
CUNNING wrote:
請問一下如果json(恕刪)


簡單的回覆是:
網路上面大多建議放在 Amazon AWS S3 或是 GitHub,如果要放在 Google,網址必須包含API Key,比較不安全,至於Microsoft OneDrive或Azure,我比較不熟悉,無法回答。

如果一定要放在Google Drive,詳細步驟如下:

步驟一:登入Google Cloud Platform,建立專案



步驟二:為專案取得API金鑰(API Key)



步驟三:為專案啟用Google Drive API



步驟四:測試JSON網址

Google Drive API 網址格式為:

"https://www.googleapis.com/drive/v3/files/FILE-ID?alt=media&key=API-KEY"

FILE-ID: JSON 檔案的辨識碼,在設定檔案共享,取得「連結」後可以看到
API-KEY: 專案的API金鑰

測試程式如下,如果看到JavaScript或其他內容,就是有問題,要看到JSON檔原始內容才正確。

// Testing Google Drive API to access an JSON file.
import Foundation

let 網址 = "https://www.googleapis.com/drive/v3/files/FILE-ID?alt=media&key=API-KEY"
let 結果 = try String(contentsOf: URL(string: 網址)!)
print(結果)

雪白西丘斯 wrote:
比較不安全,至於Microsoft OneDrive或Azure,我比較不熟悉,無法回答



了解,我現在用線上EXCEL轉JSON檔,中文全變亂碼
剛下載一個VBA轉也是不能用中文
老師是用什麼轉檔的?
CUNNING wrote:
了解,我現在用線上E(恕刪)


我用Google試算表的外掛程式 ESD (Export Sheet Data),請參考第3單元3-9課內容
CUNNING
https://products.aspose.app/cells/zh-hant/conversion/excel-to-json剛找到這個能轉中文的
CUNNING
剛才用Export Sheet Data搞定了,要先把XSLX儲存GOOGLE SHEET才能用擴充功能,GOOGLE的東西我比較不熟,謝謝老師
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!