從程式生成 UI 元件

以生成 label 為例

import UIKitlet rect = CGRect(x: 0, y: 0, width: 200, height: 100)let label = UILabel(frame: rect)label.numberOfLines = 0label.backgroundColor = UIColor(red: 128/255, green: 100/255, blue: 0, alpha: 1)label.text = "  我要找到你,\n  不管南北東西"label.textColor = UIColor(red: 240/255, green: 128/255, blue: 128/255, alpha: 1)label.layer.borderWidth = 5label.layer.borderColor = UIColor(red: 0, green: 0, blue: 1, alpha: 1).cgColorlabel

import UIKit

UI 相關的東西定義在 UIKit framework 裡,所以要加入 UIKit,才能使用 UILabel 和 UIColor 。

let rect = CGRect(x: 0, y: 0, width: 200, height: 100)

產生長方形,設定它的位置(x, y 座標)和尺寸(width, height 寬高),CGRect 的 rect 是長方形 rectangle 的縮寫。

ps: 點選 playground 右邊圓形的 Quick Look & 長方形的 Show Result,將可進一步看到生成東西的畫面,比方剛剛的長方形或是待會產生的 label。

let label = UILabel(frame: rect)

產生 label,以長方形型別的 frame (框框)描述它的位置和尺寸。

我們也可以將生成 CGRect & UILabel 的程式合併為一行,例如以下例子:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 100))

大部分的 UI 元件都可以在生成時傳入 frame 設定它的大小位置,比方以下生成 button 的例子:

let button = UIButton(frame: CGRect(x: 0, y: 0, width: 200, height: 100))

我們也可以在產生 UI 元件後,後來再透過它的 frame 屬性修改它的大小位置,例如以下例子。

label.frame = CGRect(x: 0, y: 0, width: 200, height: 100)

frame 是 UIView 的屬性,因為大部分的 UI 元件都繼承自 UIView,因此我們可以透過 frame 修改 label,button,image view 等元件的大小位置。

label.numberOfLines = 0

設定文字的行數,0 表示可顯示任意行數的文字。

label.backgroundColor = UIColor(red: 128/255, green: 100/255, blue: 0, alpha: 1)

設定 label 的背景顏色。

開發 iOS App 時,若要從程式指定顏色,一般會生成 UIColor 物件。相關說明可參考以下連結:

label.text = “ 我要找到你,\n 不管南北東西”

設定 label 的文字。\n 表示換行。

label.textColor = UIColor(red: 240/255, green: 128/255, blue: 128/255, alpha: 1)

設定 label 的文字顏色。

label.layer.borderWidth = 5

設定 label 的邊框寬度。

label.layer 會得到 CALayer 物件。CALayer 物件控制元件呈現的樣子,比方圓角和陰影。

label.layer.borderWidth 表示存取 label 的 layer 的 borderWidth,borderWidth 是 layer 的屬性,型別為 CGFloat。( CGFloat 也是浮點數的型別,跟 Float 類似。)

我們也可以分開寫,先將 label.layer 存到變數 layer,然後再設定 layer 的 borderWidth。

var layer = label.layerlayer.borderWidth = 5

寫程式時我們常常看到類似 label.layer.borderWidth 這樣 A.B.C 的格式,利用一連串的 . 串聯讀取 C 的內容,其實這跟講中文雷同,我們會說妹妹的同學的媽媽的弟弟的朋友的名字。為了更清楚這樣的概念,讓我們再看一個讀取 label 寬度的例子:

label.frame.size.width 代表 label 的框框的尺寸的寬度。

label.layer.borderColor = UIColor(red: 0, green: 0, blue: 1, alpha: 1).cgColor

設定 label 的邊框顏色。

由於 borderColor 的型別是 CGColor,所以我們需要給它 CGColor 的東西。我們可從 UIColor 的 property cgColor 得到型別 CGColor 的顏色。

如果直接將 UIColor 的內容存入 borderColor,將產生型別不合的錯誤。

像剛剛這樣從 UIColor 物件的 property 取得 CGColor 物件的例子,其實在 iOS SDK 時常看到,相關的資訊可參考以下連結。

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com