#39 製作拍立得 App 學習 if else
以製作拍立得相機熟悉 if else 的用法,以及多頁式 Outlet 、 Class 的設定方式。
照片就用我們家的金牌吃貨兔兔「年年」吧😂~吃到翻白眼
基本的照尺寸更換可以理解,但更複雜的就要參考學長姐的作業,邊學邊研究。
這個作業順便練習多頁式的設定
因為最近作業的數量接近宇宙大爆炸等級,所以先挑比較不熟的來研究。
功能設定:
- 設定三種照片比例:1:1,4:3,16:9
- 按鈕輪流切換三種尺寸
- 設定文字輸入
- 設定文字輸出
- 設定導覽頁
- 熟悉多頁拉 Outlet 與 Class 設定
- 導入自訂字型
多頁拉 Outlet 與 Class 雖然課程還沒教到,但是常常看到學長學姊的作業是多頁式的,
所以跟著練習看看。
收鍵盤
設定二個地方,一個是 Text Fidel 點擊 Return 收鍵盤、一個是點任意處收鍵盤
(1) Text Fidel 拉 Outlet 時 選擇 Did End On Exit
@IBAction func dismissKeyboard(_ sender: UITextField) { photoText = sender.text! }
(2) 新增觸控收鍵盤 Tap Gesture Recognizer
Tap Gesture 設定很容易拉錯連到奇怪的地方例如背景,所以錄了一個 Outlet 連結動畫做紀錄。
@IBAction func onTap(_ sender: UITapGestureRecognizer) {
view.endEditing(true)
}
PS. 雖然點擊 Tap 可以收起鍵盤,但是如果要讓 Text Fidel 裡輸入的文字可以出現在最終照片上,還是需要按下 Return 鍵
照片編輯區
這邊照片尺寸是進行裁切,而非縮放,所以襯了一張半透明的兔兔照片在最底下,示意原圖大小
而把真正要進行選取的兔兔照片包在 View 裡面,在 View 上面設定裁切尺寸,圓角以及邊框。
layer.borderWidth
、layer.cornerRadius
因為要讓 View 裡的照片被裁切,所以 Clips to Bounds 要打勾
照片設定 Scale To Fill
切換照片比例
新增按鈕,拉 IBAction
並設定高寬變數,使用 if else 判斷式來切換三種比例
利用currentTitle
變更按鈕文字
語法:currentTitle
顯示在按鈕上的當前標題。當按鈕狀態發生變化時,他將自動設置此屬性。 對於與它們關聯的沒有自定義標題字符串的狀態,此方法返迴當前顯示的標題,通常是與正常狀態關聯的標題。 值可能是零。
@IBAction func proportionButton(_ sender: UIButton) {
var width: CGFloat = 428
var height: CGFloat = 570
if sender.currentTitle == "1 : 1"{
ratio = "3 : 4"
width = 326
height = width / 3 * 4
} else if sender.currentTitle == "3 : 4"{
ratio = "16 : 9"
width = 326
height = width / 16 * 9
} else {
ratio = "1 : 1"
width = 326
height = width
}
sender.setTitle(ratio, for: UIControl.State.normal)
subView.frame = CGRect(x: (view.frame.width-width)/2, y: 139+(view.frame.width-height)/2, width: width, height: height)
imageView.frame = CGRect(x: -(view.frame.width-width)/2, y: -(view.frame.width-height)/2, width: 428, height: 570)
print("subView", subView.frame)
print("imageView", imageView.frame)
}
imageView 需與 orgineView 大小位置完全重疊,因此
imageView 的 x = 負的 subView 的 x
imageView 的 y = 負的 (subView 的 y — originView 的 y)
由於 subView 的位置是置中放置,所以
subView 的 x = (view 的 width — subView 的 width)/2
因此 imageView 的 x
又可以 = — (view 的 width — subView 的 width)/2
這裡卡的有點久但總算是稍微理解了
新增 導覽頁
按右下角 Navigation controller
修改返回按鈕文字
第二頁左上角預設文字為 Back 要修改的話選取左邊的 Navigation item
在右邊的屬性面板上 Back Button 填入想顯示的文字
輸入 Edit
三個比例的照片
第二頁的元件設定
複製第一頁的大部分元件貼過去,再新增一個拍立得相紙的View把 SubView包起來
因應此改變,subView.frame.x 會變成
(blankView的width — subView的width)/2
新增類別 Class
多頁設計要拉 Outlet 時必須要新增 Class
更詳細參考彼得潘的文件:
當我們想要新增類別,並讓它繼承 Cocoa Touch framework 的類別時,新增的步驟如下:
新增Cocoa Touch Class 的步驟說明
- 點選File > New > File 新增檔案。( 或是快速鍵cmd + N)
- 選擇Cocoa Touch Class。 …
- 從Subclass of 欄位設定繼承的父類別。 …
- 從Class 欄位輸入類別的名字。 …
- 點選右下角的Next。
- 點選右下角的Create 建立類別的swift 檔。
Subclass of 選擇 UIViewController
Class輸入 PhotoViewController
左側可以看到產生新的檔 PhotoViewController.swift
第二頁的程式要寫在這裡
連結Class與頁面
設定好第二頁的 Class 就來將頁面與 Class 做連結。
選取第二頁,在 Identity 裡的 Class 選擇剛剛建立的 PhotoViewController 建立連結
之後就可以開始為第二頁拉 Outlet 了
開 Assistant 就會開啟 PhotoViewController
照片輸出口處理
因為有動畫與定位的設定,還不是很了解
照片輸出動畫時,照片與文字會浮在輸出口上面,所以決定把照片輸出口的刪掉一