直接上干貨帽衙,先來看最終效果:
基礎款
[圖片上傳中...(iShot2022-03-23 15.32.09.gif-100630-1648021552876-0)]
基礎款打印日志如下:
basic.png
升級款
1.文字與圖片中間有間距厉萝,更加美觀
2.左對齊榨崩,點擊后不會閃動章母,
3.兼容OC工程,可以直接拖到OC工程里面使用彩郊,
4.回調(diào)使用枚舉蚪缀,更加直觀
iShot2022-03-23 15.32.09.gif
升級款打印日志如下:
super.png
寫這篇文章的緣由询枚,之前都是用OC語言來封裝一些控件,現(xiàn)在項目需要慢慢切換到Swift語言哩盲,由此而來,就需要使用swift語言來封裝一些控件惠险,用來記錄封裝的過程抒线,同時希望對小伙伴們有所幫助
基礎款封裝代碼如下:
//
// OWCustomConfigView.swift
// CustomView
//
// Created by ZZ on 2022/3/23.
//
import Foundation
import UIKit
open class OWCustomConfigView : UIView {
var selectedIndex = 0
var buttonsClickIndex : ((Int)->())?
init(titles:[String], selectedIndex:Int, buttonsClickIndex:@escaping (Int)->()) {
super.init(frame: CGRect.zero)
self.selectedIndex = selectedIndex
self.buttonsClickIndex = buttonsClickIndex
var couter = 0;
let btnHeight = 60.0
let btnWidth = 150.0
for item in titles {
let button = UIButton()
button.frame = CGRect(x: 0, y: btnHeight*Double(couter), width: btnWidth, height: btnHeight)
button.setTitle(item, for: .normal)
button.backgroundColor = .red
button.tag = couter
button.addTarget(self, action: #selector(buttonClick(button:)), for: .touchUpInside)
couter += 1
self.addSubview(button)
}
for view in self.subviews {
// print("button tag is \(view.tag)")
let button = view as! UIButton
if button.tag == selectedIndex {
button.setImage(UIImage(named: "successArrow"), for: .normal)
}else {
button.setImage(UIImage(named: ""), for: .normal)
}
}
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func buttonClick(button:UIButton) {
let tag = button.tag
// print("tag= \(tag)")
guard let desButtonsClickIndex = self.buttonsClickIndex else { return }
desButtonsClickIndex(tag)
// 另一種效果
for view in self.subviews {
// print("button tag is \(view.tag)")
let button = view as! UIButton
if button.tag == tag {
button.setImage(UIImage(named: "successArrow"), for: .normal)
}else {
button.setImage(UIImage(named: ""), for: .normal)
}
}
}
}
使用的地方:
//
// ViewController.swift
// CustomView
//
// Created by ZZ on 2022/3/23.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .purple
let titles = ["藍牙模式","WIFI模式","AP模式"]
let myView = OWCustomConfigView(titles: titles, selectedIndex: 0) { index in
print("selected index: \(index)")
switch index {
case 0:
print("ble")
case 1:
print("wifi")
case 2:
print("ap")
default:
print("ble")
}
}
myView.frame = CGRect(x: 100, y: 100, width: 200, height: 300)
view.addSubview(myView)
// Do any additional setup after loading the view.
}
}
升級款封裝代碼如下:
//
// OWCustomConfigView.swift
// CustomView
//
// Created by ZZ on 2022/3/23.
//
import Foundation
import UIKit
@objc enum ConfigMode :Int {
case ble = 0
case wifi
case ap
}
@objcMembers
open class OWCustomConfigView : UIView {
var selectedMode = ConfigMode.ble
var clickMode : ((ConfigMode)->())?
let btnHeight = 60.0
let btnWidth = 150.0
init(titles:[String], selectedMode:ConfigMode = .ble, clickedMode:@escaping (ConfigMode)->()) {
super.init(frame: CGRect(x: 0, y: 0, width: btnWidth, height: btnHeight*Double(titles.count)))
self.selectedMode = selectedMode
self.clickMode = clickedMode
var couter = 0;
for item in titles {
let button = UIButton()
button.frame = CGRect(x: 0, y: btnHeight*Double(couter), width: btnWidth, height: btnHeight)
button.setTitle(item, for: .normal)
button.backgroundColor = .gray
button.contentHorizontalAlignment = .left
button.titleEdgeInsets = UIEdgeInsets.init(top: 0, left: 40, bottom: 0, right: 0)
button.imageEdgeInsets = UIEdgeInsets.init(top: 0, left: 20, bottom: 0, right: 0)
button.tag = couter
button.addTarget(self, action: #selector(buttonClick(button:)), for: .touchUpInside)
couter += 1
self.addSubview(button)
}
for view in self.subviews {
// print("button tag is \(view.tag)")
let button = view as! UIButton
if button.tag == selectedMode.rawValue {
button.setImage(UIImage(named: "successArrow"), for: .normal)
}else {
button.setImage(UIImage(named: "successArrowHidden"), for: .normal)
}
}
}
public override init(frame: CGRect) {
super.init(frame: frame)
}
required public init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func buttonClick(button:UIButton) {
let tag = button.tag
// print("tag= \(tag)")
guard let desButtonsClickedMode = self.clickMode else { return }
desButtonsClickedMode(ConfigMode(rawValue: tag)!)
// 另一種效果
for view in self.subviews {
// print("button tag is \(view.tag)")
let button = view as! UIButton
if button.tag == tag {
button.setImage(UIImage(named: "successArrow"), for: .normal)
}else {
button.setImage(UIImage(named: "successArrowHidden"), for: .normal)
}
}
}
}
其中@objc
,@objcMembers
等關鍵字是為了兼容OC工程抑进,方便在OC工程中使用
進階款使用的地方:
//
// ViewController.swift
// CustomView
//
// Created by ZZ on 2022/3/23.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .purple
let titles = ["藍牙模式","WIFI模式","AP模式"]
let myView = OWCustomConfigView(titles: titles, selectedMode: .ble) { mode in
print("selected index: \(mode.rawValue)")
switch mode {
case .ble:
print("ble")
case .wifi:
print("wifi")
case .ap:
print("ap")
}
}
myView.frame = CGRect(x: 100, y: 100, width: 200, height: 400)
view.addSubview(myView)
// Do any additional setup after loading the view.
}
}
結尾
今天的分享至此接近尾聲嘍睡陪,小伴們,覺得有點用的話,或者已經(jīng)看到這里面來的請點贊加關注吧~~ 后續(xù)分享更多iOS原生技術及物聯(lián)網(wǎng)技術相關文章信殊。如果有疑問的話汁果,歡迎在下方留言~