Learn Swift HK — 2019/03/02
聚會記錄及筆記
這次回香港處理簽證順道參加了 Learn Swift HK 的聚會,在這邊簡單記錄一下活動心得和筆記。
Learn Swift HK 算是一個還蠻新的社群,主辦人去年從美國回來後才開始舉辦,但這個社群似乎是香港唯一一個活著的iOS社群,基本上一個禮拜會舉辦一次活動,活動的基本資訊可以在meet up上面找到。
進行方式
主辦人會先設定一個主題,然後就那個主題進行解說,主要是口述,會有sample code 可以看,也會帶實作。
活動記錄
這天的活動在天后的一間咖啡店舉行,總共有六人參加,其中有一位是外籍人士所以我們全程用英語進行交流。一開始大家先輕鬆的聊天,自我介紹、認識彼此、聊聊做過的 App等等,然後便進入主題討論。這是原本的主題是 Private V.S Fileprivate ,但內容有點少所以我們臨時加碼用 Firebase 寫了個註冊頁面。
整個活動下來感覺十分充實,有認識新朋友之餘,也學到新東西,可惜之後無法繼續參加,但我知道大家都一定會繼續變強,期待下次再交流!
聚會筆記
Private跟 Fileprivate的分別
- Private 的 functions以及 variables 限class內存取, class的範圍也包括其他檔案中的extensions。
- Fileprivate 的 functions以及 variables 在檔案內所有的class都可以存取但在該檔案外便不能存取。
- Setter 和 Getter 可設不同的權限,例如:
private(set) public var foo: String?
-> setter 會是private而getter會是public
用程式碼設 Autolayout
成品畫面:
Step 1: 創建一個root view controller
將以下代碼添加到AppDelegate中的didFinishLaunchingWithOptions
self.window = UIWindow() // 初始化windowself.window?.makeKeyAndVisible() // 設為主畫面並顯示let signUpController = SignUpController() // 初始化 SignUpControllerlet navController = UINavigationController(rootViewController: signUpController) // 初始化navigation controller並把signUpController設為它的根視圖window?.rootViewController = navController // 設定整個APP的根視圖為navController
Step 2: 創建一個設定頭像的按鈕
在Sign Up Controller中添加一個按鈕:
let plusPhotoButton: UIButton = {var button = UIButton(type: .system)button.setImage(UIImage(named: "plus")?.withRenderingMode(.alwaysOriginal), for: .normal)
// withRenderingMode設為alwaysOriginal ->用圖片本來的顏色,不用tintColor的設定return button}()
Step 3: 用程式碼設 Auto layout
使用 NSLayoutConstraint.activate() 啟用約束條件
override func viewDidLoad() {super.viewDidLoad()self.view.backgroundColor = UIColor.whiteview.addSubview(plusPhotoButton) // 添加ButtonNSLayoutConstraint.activate([plusPhotoButton.widthAnchor.constraint(equalToConstant: 140), // 固定寬度140ptplusPhotoButton.heightAnchor.constraint(equalToConstant: 140), // 固定高度140ptplusPhotoButton.centerXAnchor.constraint(equalTo: view.centerXAnchor), // 水平置中plusPhotoButton.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 50) // 與safeArea之間的距離為50pt])}
效果:
如果想更方便可以在UIView的Extension加一個方法使用:
extension UIView {func anchor(top: NSLayoutYAxisAnchor?, leading: NSLayoutXAxisAnchor?, trailing: NSLayoutXAxisAnchor?, bottom: NSLayoutYAxisAnchor?,paddingTop: CGFloat, paddingLeading: CGFloat, paddingTrailing: CGFloat, paddingBottom: CGFloat, width: CGFloat, height: CGFloat) {translatesAutoresizingMaskIntoConstraints = falseif let top = top {self.topAnchor.constraint(equalTo: top, constant: paddingTop).isActive = true}if let leading = leading {self.leadingAnchor.constraint(equalTo: leading, constant: paddingLeading).isActive = true}if let trailing = trailing {self.trailingAnchor.constraint(equalTo: trailing, constant: -paddingTrailing).isActive = true}if let bottom = bottom {self.bottomAnchor.constraint(equalTo: bottom, constant: -paddingBottom).isActive = true}if width != 0 {self.widthAnchor.constraint(equalToConstant: width).isActive = true}if height != 0 {self.heightAnchor.constraint(equalToConstant: height).isActive = true}}}
記得要把約束條件的isActive 設為true 以啟用約束條件!
把Text Field加進Stack View 再用同一原理設置約束條件就能得到一個美美噠註冊畫面,這邊便不再多述了。之前我主要是用Storyboard 刻UI,今次用了純code,感覺不錯,希望能成為棄用 Storyboard 的開端。
整個專案: