#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.borderWidthlayer.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 的步驟說明

  1. 點選File > New > File 新增檔案。( 或是快速鍵cmd + N)
  2. 選擇Cocoa Touch Class。 …
  3. 從Subclass of 欄位設定繼承的父類別。 …
  4. Class 欄位輸入類別的名字。 …
  5. 點選右下角的Next。
  6. 點選右下角的Create 建立類別的swift 檔。

Subclass of 選擇 UIViewController

Class輸入 PhotoViewController

左側可以看到產生新的檔 PhotoViewController.swift

第二頁的程式要寫在這裡

連結Class與頁面

設定好第二頁的 Class 就來將頁面與 Class 做連結。

選取第二頁,在 Identity 裡的 Class 選擇剛剛建立的 PhotoViewController 建立連結

之後就可以開始為第二頁拉 Outlet 了

開 Assistant 就會開啟 PhotoViewController

照片輸出口處理

因為有動畫與定位的設定,還不是很了解

照片輸出動畫時,照片與文字會浮在輸出口上面,所以決定把照片輸出口的刪掉一

動畫展示

--

--

Rose
彼得潘的 Swift iOS / Flutter App 開發教室

Coding & Design 一直在學習的路上,從未停止,一有空檔就會摸摸我的兔子🐰