iOS 用Swift自定義封裝一個View(兼容OC)

直接上干貨帽衙,先來看最終效果:

基礎款
[圖片上傳中...(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)技術相關文章信殊。如果有疑問的話汁果,歡迎在下方留言~

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市鳄乏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌汞窗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件不铆,死亡現(xiàn)場離奇詭異裹唆,居然都是意外死亡,警方通過查閱死者的電腦和手機许帐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門成畦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人循帐,你說我怎么就攤上這事≈粞” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵跛梗,是天一觀的道長棋弥。 經(jīng)常有香客問我,道長嘁锯,這世上最難降的妖魔是什么聂薪? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任藏澳,我火速辦了婚禮,結果婚禮上翔悠,老公的妹妹穿的比我還像新娘野芒。我一直安慰自己双炕,他們只是感情好,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布摇锋。 她就那樣靜靜地躺著站超,像睡著了一般。 火紅的嫁衣襯著肌膚如雪死相。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天生宛,我揣著相機與錄音肮柜,去河邊找鬼。 笑死素挽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的预明。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼酥馍,長吁一口氣:“原來是場噩夢啊……” “哼阅酪!你這毒婦竟也來了?” 一聲冷哼從身側響起砚尽,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辉词,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瑞躺,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兴想,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡赡勘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年闸与,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片几迄。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖木羹,靈堂內(nèi)的尸體忽然破棺而出解孙,到底是詐尸還是另有隱情,我是刑警寧澤弛姜,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站苍在,受9級特大地震影響荠商,放射性物質(zhì)發(fā)生泄漏寂恬。R本人自食惡果不足惜莱没,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一饰躲、第九天 我趴在偏房一處隱蔽的房頂上張望牙咏。 院中可真熱鬧嘹裂,春花似錦、人聲如沸盯拱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拼卵。三九已至,卻和暖如春腋腮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背徊哑。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工聪富, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墩蔓。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓奸披,卻偏偏與公主長得像昏名,于是被迫代替她去往敵國和親阵面。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355