iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
1
自我挑戰組

Hey! UIKit, 做個朋友吧~系列 第 14

Day 14: 到底要on還是要off?選擇障礙的我與UISwitch

  • 分享至 

  • xImage
  •  

終於到了IBAction七人眾的最後一集,但UISwitch的內容好少喔!為什麼我的結局總是這麼虛弱?要被酸民攻擊爛尾了嗚嗚嗚QQ


UISwitch可以用來決定二選一的選擇,像是on/off。
當你改變switch狀態的時候,switch會發送一個valueChange的event並執行相對應的target-action。

State

switch只有on/off兩種state,可以用setOn(_:animated:)來決定初始的開關狀態,用isOn取得目前的開關狀態。isOn是一個布林值,如果開關的狀態為off,則isOn為false。

通常switch的target-action會利用isOn回傳的值做一個判斷式,以決定開關時分別執行的動作:

@objc func stateSwitch(_ sender: UISwitch) {
    if sender.isOn {
        boolLabel.text = "true"
        boolLabel.textColor = UIColor.black
        view.backgroundColor = UIColor.white
    } else {
        boolLabel.text = "false"
        boolLabel.textColor = UIColor.white
        view.backgroundColor = UIColor.black
    }
}


還有另一種做法是extension Bool。
因為UISwitch本身就是一個on(true)/off(false)的二選一抉擇,所以可以直接在Bool裡extension prorerties,對true跟false的狀況分別做指定。

extension Bool {
    var foregroundColor: UIColor {
        return self ? UIColor.black : UIColor.white
    }
    var backgroundColor: UIColor {
        return self ? UIColor.white : UIColor.black
    }
}

上述程式碼定義了兩個變數,foregroundColor在true時為白色,false時為黑色,而backgroundColor相反。
接下來再把這2個變數分別指定給Label跟View:

let bool = sender.isOn
boolLabel.textColor = bool.foregroundColor
view.backgroundColor = bool.backgroundColor

在Label與背景顏色的轉換上也會與範例相同。

Color

switch可以客製化開關與thumb的顏色,預設開關為綠色,thumb為白色。

newSwitch.onTintColor = UIColor.red
newSwitch.thumbTintColor = UIColor.yellow

Image

這是一個超邊緣的property...

在很久很久以前,可以用onImage跟offImage分別設定on/off處的圖片,但這個property在iOS 7之後被改掉了。
注意我是說改掉不是拿掉...工程師們只是剝奪了他的功能,讓他毫無作用,卻沒有拿掉這個property。時至今日已經升級到了iOS 13,大家都搶著更新好捏自定義emoji跟玩馬利歐賽車,他卻都還沒有被處理掉。

我想,他應該已經被工程師們遺忘了吧!
幫QQ

那下一回終於要講他們的老大-UIControl。
到底這群8+9的老大是怎樣的一號人物呢?敬請期待~


上一篇
Day 13: 我碰了UISlider~就~咻的滑過去了
下一篇
Day 15:終於要打王了...納命來吧UIControl!!
系列文
Hey! UIKit, 做個朋友吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

我要留言

立即登入留言