學習日誌一:學寫程式的百感交集
目錄
⦿ 心情感言
⦿ Xcode
⦿ UIKit
⦿ frames、bounds
⦿ 賦值
心情感言,以網誌做為學習過程的紀錄,卻不只是拿來當作工具書,而是將心路歷程舖在網上。
有時候學習不會一直往前,因為總有事情耽擱,就像重拾程式語言的我,在接觸到 Swift 時,使用的開發工具 Xcode 的版本一樣,待我娓娓道來。
影視圈打滾多年,在萌生退意的那刻,我有了一個將來的方向,那便是軟體工程,大學在校僅學過 Fortran,對寫程式興趣缺缺,卻仍明白自己對數字的邏輯是有一套的,接著只花了點時間便決定先以開發 iOS 為主,安裝Xcode,還找回了 C 語言,為什麼說找回呢?
我認為當初如果學校教的是 C 或 C++,自己大概會喜歡寫程式,好吧,主要還是因為教程式的老師令人提不起興趣,在土木工程的學涯,課堂上常常有相似氛圍,總之呢,程式之旅就此展開。
那年,遭遇了感情問題,連帶家庭失和,手上綁著一個拖很久的案子的我,陰錯陽差地跑去國小當了自然科的代理教師,在此之前已開始學習C語言,沒有坐吃山空的本錢,只能一邊工作一邊進度緩慢地加強程式這一塊,接著疫情就爆發了,也許是因為各種焦頭爛額才擱置了學習,那時的 Xcode 版本大概是 9,回過神卻已變成 12⋯⋯。
不知不覺又過了一年,重啟學習是多令人開心的一件事,但網路上的資源卻參差不齊,一步步照著做總是少了些什麼,學習體驗非常差,要知道 Xcode過去使用 Objective-C 來開發 APP,Swift 進來後便有一種不那麼艱澀,平易近人的感覺,不不,這都是騙你的,怎可能一朝一夕就變得簡單,難道睡上一覺,隔天開竅就領悟神功?不。
蘋果似乎是想把開發帶到世界每個角落,讓眾人幫忙抬抬轎 (?),但是 Swift當初就被人唸說像是半成品便端出來的東西,接著在大家還沒完全弄懂 UIKit 之際,SwiftUI 就出來了,且 Xcode 12 創建專案時就勸退了新手吧!
的確,寫程式使用 IDE 時,常常需踩很多坑。
繼續閱讀|回目錄
Xcode
在 Xcode 這個 IDE 上,雖然我們可以忽略 Objective-C,可是 interface 的就分為 SwiftUI 跟 storyboard,要是舊版習慣一路按確定,進到專案裡找不到storyboard 可謂慘不忍睹。
接著,Life Cycle 的地方又再次分了 SwiftUI App 跟 UIKit App Delegate,但我們可以簡單理解為你想用 SwiftUI 開始寫程式便選擇 SwiftUI,相反地想要用 UIKit 來編寫,interface 的地方便要選擇 storyboard 了。
而 Life Cycle 的設定就不提了,主要還是讓人覺得軟體一直在更新,一直有新功能,可是呢,經驗告訴我們,通常前一版,或前前一版比較穩定。
繼續閱讀|回目錄
UIKit
好的,以上簡單敘述了前因後果,接下來要記錄的學習是關於 UILabel、UITextField、UITextView、UIButton,既然是 UI 開頭,就要明白他們是UIKit,創建之時我們會這樣做:
let myLabel = UILabel(frame: CGRect(x: , y: ,
width: , height: ))let myTextField = UITextField(frame: CGRect(x: , y: ,
width: , height: ))var myTextView: UITextView!
myTextView = UITextView(frame: CGRect(x: , y: ,
width: , height: ))var myButton: UIButton!
myButton = UIButton(frame: CGRect(x: , y: ,
width: , height: ))繼續閱讀|回目錄
因為確定 frame,需有 x、y、width、height,很多時候我們會先獲取螢幕尺寸,便這樣做:
let fullScreenSize = UIScreen.main.bounds
而 bounds 中包括兩種屬性:
1. origin (原點位置)
2. size (尺寸)
兩者分別用 CGPoint 跟 CGSize 來設置,就像上面看到的 frame
(frame: CGRect(x: , y: , width: , height: ))
我們可以簡單地宣告屬性並賦值,或是宣告屬性後在另外一行賦值,如myTextView 及 myButton,可以 .center = CGPoint(x: , y: ) 來訂定位置。
繼續閱讀|回目錄
frame、bounds
frame 跟 bounds 雖然都有位置、寬高,但兩者的意義卻不同,bounds 是以自己為主的位置,或說自己在行動裝置裡的位置;而 frame 則是以父視圖為主的位置,即是你在容器裡的位置,你自己是子視圖。
繼續閱讀|回目錄
賦值
宣告後,必須要記得將之加到父視圖中,如下面的 view 就是父視圖:
self.view.addSubview(myButton)
將創建的元件加入父視圖是寫在 Life Cycle 的 viewDidLoad 中,如下:
override func viewDidLoad( ) {
super.viewDidLoad
self.view.addSubview(myButton)
}
另外, var myTextView: UITextView! 這宣告要寫在 viewDidLoad 的上方,而如果有使用 IBAction 或宣告的其他函數則寫在 viewDidLoad 的下方。
夜深了,人靜。
繼續閱讀|回目錄