標籤:cte 操作 推斷 設定 view uibutton UI gre code
關於Swift的基本概念及文法知識。我在前面的章節中已經介紹了非常多。這一節和下一節主要有針對性的解說Swift在實際UIKit開發中的使用情境及注意點。先來看看Demo的終於。
Demo分析:
1. 介面上面有三個button,他們的寬度不一致。
2. 點擊每一個button的時候。以下有紅色底線跟著"走動"。
一、 Storyboard中的設計
注意到,這個紅色底線是任意擺放的。沒有刻意的設定它的位置及寬度。而這個紅色底線也就是一個簡單的UIView。
二、 拖線工作
在本例中,有三個IBOutlet連線工作,代碼例如以下:
@IBOutlet weak var firstButton: UIButton!@IBOutlet weak var underline: UIView!@IBAction func btnClick(sender: UIButton)
1. 之所以連線第一個button。是由於程式剛啟動的時候,應該預設運行點擊第一個button的事件,以此來改變紅色底線的位置及寬度。
2. underline這個UIView便是這個紅色底線。
關於上面 "!" 使用假設有什麼疑問的話。能夠參照 《Swift:可選類型(Optional)》。
3. btnClick 這種方法就是三個button的共同點擊事件。
三、 button點擊事件分析
代碼例如以下:
UIView.animateWithDuration(0.25, animations: { () -> Void inself.selectedButton?.selected = falsesender.selected = trueself.selectedButton = sender // 要先設定寬高,後設定位置,不然效果有影響self.underline.frame.size.width = sender.frame.size.widthself.underline.center.x = sender.center.xself.underline.frame.origin.y = CGRectGetMaxY(sender.frame) + 5 })
代碼中的前三句是經典的button點擊三部曲(用來切換button的點擊狀態),後面三句就是用來實現終於的動畫;程式簡單明了,我就不做過多的解釋工作。
僅僅想說明兩點:
1. selectedButton 是定義的一個屬性,用來指向被選中的button。
2. self.selectedButton?.selected = false 事實上是代碼的簡寫形式。也能夠寫成以下的形式,他們是等價的。
if(self.selectedButton != nil){ self.selectedButton.selected = false}
注意: 在推斷語句中,我們使用了比較推斷,即self.selectedButton 是否為nil。
在objective-c中,或許大家會直接書寫成 if(self.selectedButton) 進行推斷就能夠了。可是在Swift中這樣書寫是錯誤的。
由於Swift是型別安全的語言,推斷條件必須是bool值。即使你在Swift中寫成 if(1) 這種推斷條件也是失敗的。
四、 預設選中第一個button
這個操作事實上是非常easy的。僅僅要在viewDidLoad中加一句
self.btnClick(self.firstButton)
但會出現底線預設會移動的效果。由於底線預設不在第一個button的下方。所以運行動畫,會移動過去。
解決的辦法就是在預設載入的時候,禁止動畫就可以。所以終於的代碼例如以下:
class ViewController: UIViewController { weak var selectedButton: UIButton! @IBOutlet weak var firstButton: UIButton! @IBOutlet weak var underline: UIView! @IBAction func btnClick(sender: UIButton) { UIView.animateWithDuration(0.25, animations: { () -> Void in self.selectedButton?.selected = false sender.selected = true self.selectedButton = sender self.underline.frame.size.width = sender.frame.size.width self.underline.center.x = sender.center.x self.underline.frame.origin.y = CGRectGetMaxY(sender.frame) + 5 }) } override func viewDidLoad() { super.viewDidLoad() // 介面剛載入進來的時候。禁止動畫 UIView.setAnimationsEnabled(false) self.btnClick(self.firstButton) UIView.setAnimationsEnabled(true) }}
Swift:UIKit中Demo(一)