#瘋狂購物APP (UIStepper 和數字變字串練習)
功能展示
- 利用 UIBlurEffect 製作模糊背景
- 利用 UIViewPropertyAnimator 產生動畫
- 利用 IBSegueAction 將資料傳輸到下一頁
- 利用 UIAlertController 產生警示匡
- 利用 UIStepper 串連 TextField 數值
製作模糊背景
override func viewDidLoad() {
super.viewDidLoad()
//創建一個模糊效果
let blurEffect = UIBlurEffect(style: .light)
//創建一個乘載模糊效果的視圖
let blurView = UIVisualEffectView(effect: blurEffect)
//設定模糊視圖的大小(全頻)
blurView.frame.size = CGSize(width: view.frame.width, height: view.frame.height)
//添加模糊視圖到頁面 view 上(模糊視圖下方都會有模糊效果)
WarningSign.isHidden = true
self.view.addSubview(blurView)
self.view.addSubview(NextpageButton)
self.view.addSubview(EnterLabel)
self.view.addSubview(BudgetTextField)
self.view.addSubview(WarningSign) }
產生文字動畫警示
當 Budget 為 0 時,無法跳至下一頁購物,並產生文字動畫
判斷是否能夠跳入下一頁
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
if BudgetTextField.text?.isEmpty == false,
Double(BudgetTextField.text!) ?? 0 > 0 {
return true
}else {
//加入提醒字幕
WarningSign.isHidden = false
WarningSign.text = "Please enter your budget"
//加入動畫
let animator = UIViewPropertyAnimator(duration: 2, dampingRatio: 0.1) {
self.LabelConstraint.constant = 55
self.view.layoutIfNeeded()
}
animator.startAnimation()
UIViewPropertyAnimator.runningPropertyAnimator(withDuration: 0.1, delay: 0) {
self.LabelConstraint.constant = 25
self.view.layoutIfNeeded()
}
return false
}
}
當沒有輸入預算或是預算等於 0 時,觸發 文字動畫 ,原本 LabelConstraint.constant 會從 25 改變成 55 產生來回抖動的動畫,要完成這個動畫必須先在文字中加入 AutoLayout
將資料傳到下一頁
利用 IBSegueAction 將資料傳到下一頁的 Label , Label 的文字抓到數值前,會要先將 Double 轉成 String
@IBSegueAction func nextpage(_ coder: NSCoder) -> ProductViewController? {
let controller = ProductViewController(coder: coder, budget: Double(BudgetTextField.text!) ?? 0)
return controller
}
跳出警示匡
當預算小於 0 時,會跳出警示匡,並將原本所選取的所有商品都清除
利用 UIAlertController 產生警告視窗
利用 clear(UIButton.self) 清除所有商品
//預算小於0時觸發警示窗口,並且清除所有所選商品
if Double(budgetLabel.text!)! < 0 {
let alertcontroller = UIAlertController(title: "💸💸💸", message: "Sorry you don't have enough budget", preferredStyle: .alert)
alertcontroller.addAction(UIAlertAction(title: "OK", style: .default, handler: nil))
present(alertcontroller, animated: true, completion: nil)
clear(UIButton.self)
}
預算同步
利用 UIStepper 串連 TextField 數值,並且同步更新下方 金額
要完成以上同步,有一個很重要的步驟是要讓 UIStepper 與 TextField 做到數值同步,當 TextField 輸入數值收下鍵盤後,必須馬上同步 UIStepper 值
//數值限制&Stepper同步textfield
func upperlimit(number: Int) {
//數值超過999時,textfield設定為999
if Double(fruitsvegetableTextField[number].text!) ?? 0 > 999 {
fruitsvegetableTextField[number].text = "999"
}
if Double(beverageTextField[number].text!) ?? 0 > 999 {
beverageTextField[number].text = "999"
}
if Double(meatfishTextField[number].text!) ?? 0 > 999 {
meatfishTextField[number].text = "999"
}
fruitsvegetableStepper[number].value = Double(fruitsvegetableTextField[number].text!) ?? 0
beverageStepper[number].value = Double(beverageTextField[number].text!) ?? 0
meatfishStepper[number].value = Double(meatfishTextField[number].text!) ?? 0
}
最後只要會動到商品的數量的地方,都需加上 updateUI() 進行同步
Scroll View AutoLayout 問題
第一步
- 在 View Controller 中加入 Scroll View
- 將 Scroll View 和 View 同時選取,Add New Alignment Constraints
第二步
- 將 Content Layout Guide 和 View 同時選取,Add New Alignment Constraints
第三步
- 選取 View ,Add New Constraints
遵照以上步驟操作,可能會出現兩種不一樣的狀況
第一種 沒有邊界的 Scroll View (錯誤的效果)
第二種 有邊界的Scroll View (所想呈現的效果)
我嘗試 第二步與第三步,互相交換,有時候效果也會隨之改變,目前不確定是遇到什麼問題,我個人嘗試了 2~3 小時,還是找不到解決方法,目前如果設定完,沒有邊界的話,我就立刻將 第二步 與 第三步 進行對調,如果有人也有遇到這種狀況,且有解決方法,歡迎留言與我討論謝謝。