美文网首页iOS
Swift - 开关 UISwitch

Swift - 开关 UISwitch

作者: 微笑中的你 | 来源:发表于2020-09-30 16:59 被阅读0次

    由于系统的开关可能不符合各种需求
    尺寸大小间距等。。。
    所以用控件堆一个 开关

    无图无真相!


    lzswitch.png

    点击事件使用了代理返回,当然你可以自行修改为 block
    间距颜色等改为所需即可

    环境

    Swift 5
    依赖 SnapKit

    用法

    class SettingVC: LzBaseVC {
    
      ...
       ///懒加载开关
        lazy var switch1: LzSwitch = {
            let v = LzSwitch(frame: CGRect.zero)
            v.layer.cornerRadius = 15
            return v
        }()
    
        override func viewDidLoad() {
            super.viewDidLoad()
            
            ...
            self.view.addSubview(switch1)
            switch1.delegate = self
    ///约束
            switch1.snp.makeConstraints { (make) in
                make.right.equalToSuperview().offset(-15)
                make.height.equalTo(30)
                make.width.equalTo(60)
                make.centerY.equalTo(lblName1)
            }
    ///添加约束后 必须设置
            switch1.setDefaultStatus(select: true)
    
    
        }
    
    }
    
    extension SettingVC: LzSwitchDelegate {
        
        func click(view: LzSwitch) {
            switch view {
            case switch1:
                debugPrint("------ \(switch1.isSelected ? "开启了" : "关闭了")-------开关1")
            case switch2:
                debugPrint("------ \(switch2.isSelected ? "开启了" : "关闭了")-------开关2")
            case switch3:
                debugPrint("------ \(switch3.isSelected ? "开启了" : "关闭了")-------开关3")
            default:
                debugPrint("其他")
            }
        }
    
    }
    
    

    LzSwitch.swift

    //
    //  LzSwitch.swift
    //  xczn
    //
    //  Created by lg on 2020/9/30.
    //  Copyright © 2020 lxf. All rights reserved.
    //
    
    import UIKit
    
    
    /// 代理
    protocol LzSwitchDelegate {
        func click(view: LzSwitch)
    }
    
    class LzSwitch: UIControl {
        
        // 标记是否滑动中
        var sliding: Bool = false
        
        var delegate: LzSwitchDelegate?
        
         lazy var viewCircle: UIView = {
            let v = UIView()
            v.backgroundColor = .white
            v.isUserInteractionEnabled = false
            return v
        }()
        
        var circleRadius: CGFloat = 10
    
        override init(frame: CGRect) {
            super.init(frame: frame)
            addSubview(viewCircle)
            viewCircle.layer.cornerRadius = self.circleRadius
            
            addTarget(self, action: #selector(changeStatus), for: .touchUpInside)
        }
        
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        public func setDefaultStatus(select: Bool) {
            isSelected = select
            if isSelected {
                self.viewCircle.snp.remakeConstraints { (make) in
                    make.left.equalToSuperview().offset(self.circleRadius/2)
                    make.width.height.equalTo(self.circleRadius*2)
                    make.centerY.equalToSuperview()
                }
                self.backgroundColor = AppConst.color_main
    
            } else {
                self.viewCircle.snp.remakeConstraints { (make) in
                    make.right.equalToSuperview().offset(-self.circleRadius/2)
                    make.width.height.equalTo(self.circleRadius*2)
                    make.centerY.equalToSuperview()
                }
                self.backgroundColor = .lightGray
            }
            
            self.layoutIfNeeded()
    
        }
        
        @objc private func changeStatus() {
            if sliding {
                return
            }
            
            if isSelected {
                sliding = true
                isSelected = false
                //动画 从左边滚到右边
                UIView.animate(withDuration: 0.25, animations: {
                    self.viewCircle.snp.remakeConstraints { (make) in
                        make.right.equalToSuperview().offset(-self.circleRadius/2)
                        make.width.height.equalTo(self.circleRadius*2)
                        make.centerY.equalToSuperview()
                    }
                    self.backgroundColor = .lightGray
                    self.layoutIfNeeded()
                }) { (ok) in
                    if ok {
                        self.sliding = false
                    }
                }
            } else {
                sliding = true
                isSelected = true
                //动画 从右 到 左
                UIView.animate(withDuration: 0.25, animations: {
                    self.viewCircle.snp.remakeConstraints { (make) in
                        make.left.equalToSuperview().offset(self.circleRadius/2)
                        make.width.height.equalTo(self.circleRadius*2)
                        make.centerY.equalToSuperview()
                    }
                    self.backgroundColor = AppConst.color_main
                    self.layoutIfNeeded()
                }) { (ok) in
                    if ok {
                        self.sliding = false
                    }
                }
            }
            if let delegate = self.delegate {
                delegate.click(view: self)
            }
        }
        
    }
    
    

    相关文章

      网友评论

        本文标题:Swift - 开关 UISwitch

        本文链接:https://www.haomeiwen.com/subject/lhxpuktx.html