標籤:類方法 尺寸 width 添加 create ram 效率 日常 custom
對於日常中重複性的可以抽取的實現盡量抽取 比如實現導覽列右側
UIBarButtonItem的添加 如果使用
private func setupNavigateionBar(){
let btn = UIButton()
btn.setImage(UIImage(named:"icon_shouye_off"), for: .normal)
btn.sizeToFit()
navigationItem.leftBarButtonItem = UIBarButtonItem(customView:btn)
//右側導覽列設定多個功能item
let firstbtn = UIButton()
firstbtn.setImage(UIImage(named:"icon_shouye_off"), for: .normal)
firstbtn.setImage(UIImage(named:"icon_shouye_on"), for: .highlighted)
//使用sizetofit會根據圖片的大小動態適應改變item大小 要想自訂btn大小需使用自訂的size改變相鄰按鈕的間隔
let size = CGSize(width: 40, height: 40)
firstbtn.frame = CGRect(origin: CGPoint.zero, size: size)
let firstRightItem = UIBarButtonItem(customView:firstbtn)
let secondbtn = UIButton()
secondbtn.setImage(UIImage(named:"icon_shouye_off"), for: .normal)
secondbtn.setImage(UIImage(named:"icon_shouye_on"), for: .highlighted)
secondbtn.sizeToFit()
let secondRightItem = UIBarButtonItem(customView:secondbtn)
let thirdbtn = UIButton()
thirdbtn.setImage(UIImage(named:"icon_shouye_off"), for: .normal)
thirdbtn.setImage(UIImage(named:"icon_shouye_on"), for: .highlighted)
thirdbtn.sizeToFit()
let thirdbtnRightItem = UIBarButtonItem(customView:thirdbtn)
navigationItem.rightBarButtonItems = [firstRightItem, secondRightItem, thirdbtnRightItem]
}
實現添加三個右側的導覽列Item 代碼冗餘比較嚴重就可以分別通過實作類別方法和構造方法兩種方式來實現抽取。
一、使用類方法
1.建立一個UIBarButtonItem-extension.swift檔案
import UIKit
extension UIBarButtonItem{
//擴充一個類方法
class func createItem(imageName:String, highImageName : String,size : CGSize) ->UIBarButtonItem{
let btn = UIButton()
btn.setImage(UIImage(named: imageName), for: .normal)
btn.setImage(UIImage(named: highImageName), for: .highlighted)
btn.frame = CGRect(origin:CGPoint.zero, size:size)
return UIBarButtonItem(customView:btn)
}
}
上面的冗餘方法即可最佳化為:
let firstRightItem = UIBarButtonItem.createItem(imageName: "icon_shouye_off", highImageName: "icon_shouye_on", size: size)//UIBarButtonItem(customView:firstbtn)
二、使用建構函式方法
//使用建構函式的方式實現上面的功能
//便利建構函式 1>必須以convenience開頭 2>在建構函式中必須明確調用一個設計的建構函式,並且是self來調用的(self)3.建構函式不需要傳回值
convenience init(imageName : String, highImageName: String, size : CGSize) {
let btn = UIButton()
btn.setImage(UIImage(named: imageName), for: .normal)
btn.setImage(UIImage(named: highImageName), for: .highlighted)
btn.frame = CGRect(origin:CGPoint.zero, size:size)
self.init(customView: btn)
}
上面的冗餘方法即可最佳化為: let secondRightItem = UIBarButtonItem(imageName : "icon_shouye_off", highImageName: "icon_shouye_on", size : size)///UIBarButtonItem(customView:secondbtn)
繼續最佳化給建構函式參數添加預設參數及邏輯判斷
convenience init(imageName : String, highImageName: String = "", size : CGSize = CGSize.zero) {
//1.建立button
let btn = UIButton()
//2.設定button圖片
btn.setImage(UIImage(named: imageName), for: .normal)
if highImageName != ""{
btn.setImage(UIImage(named: highImageName), for: .highlighted)
}
//3.設定button的尺寸
if size == CGSize.zero
{
btn.sizeToFit()
}else{
btn.frame = CGRect(origin:CGPoint.zero, size:size)
}
//4.建立UIbarbuttonItem
self.init(customView: btn)
}
左側的按鈕可以最佳化為
navigationItem.leftBarButtonItem = UIBarButtonItem(imageName:"icon_shouye_off")//UIBarButtonItem(customView:btn)
swift裡類方法和構造方法的使用來減少代碼冗餘提高開發效率