首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS -类中的自定义UISwitch

iOS -类中的自定义UISwitch
EN

Stack Overflow用户
提问于 2021-06-04 07:59:50
回答 1查看 1.2K关注 0票数 0

版本: Xcode 12.3

我的项目大量使用UISwitch。因此,我正在创建一个自定义类来自定义它。

我希望设置UISwitch默认thumbTintColorbackgroundColor,并在打开开关时更新这些颜色(isOn属性)。

我找到了一个解决方案,但当我返回到viewController时,它就不起作用了。开关不保留设置:

代码语言:javascript
运行
复制
subviews[0].subviews[0].backgroundColor = UIColor.white

我不能设置isOn,因为它是只读属性。

无论如何,我可以设置值更改吗?我想在customSwitch类中得到如下所示:

关闭: thumbTintColor = UIColor.yellow,backgroundColor = UIcolor.black

接通: thumbTintColor = UIColor.red,backgroundColor = UIcolor.white

下面是我的定制课,有人能帮忙吗?谢谢。

代码语言:javascript
运行
复制
import Foundation

@IBDesignable
class CustomSwitch: UISwitch {     
    private var previousValue = false
    private var returnPreviousValue = false
    
    override var isOn: Bool {
        return returnPreviousValue ? previousValue : super.isOn
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        
        previousValue = isOn
        addTarget(self, action: #selector(_didChange), for: .valueChanged)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        addTarget(self, action: #selector(_didChange), for: .valueChanged)
    }
    
    
    
    override func setOn(_ on: Bool, animated: Bool) {
        super.setOn(on, animated: animated)
        
        previousValue = on
    }
    
    @objc func _didChange() {
        let isOn = self.isOn
        
        if isOn == previousValue {
            return
        }
        
        returnPreviousValue = true
        willChangeValue(forKey: "on")
        returnPreviousValue = false
        
        previousValue = isOn
        didChangeValue(forKey: "on")
    }
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-04 08:54:02

代码

代码语言:javascript
运行
复制
@IBDesignable
class CustomSwitch: UISwitch {
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.initialSetUp()
    }
    
    convenience init() {
        self.init(frame: .zero)
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.initialSetUp()
    }
    
    private func initialSetUp() {
        self.addTarget(self, action: #selector(refreshUI), for: .valueChanged)
        self.refreshUI()
    }
    
    @objc private func refreshUI() {
        /// Be aware that this is more of a hack than a solution
        /// And can break in any upcoming release
        let targetSubview = self.subviews.first?.subviews.first
        
        if self.isOn {
            self.thumbTintColor = .red
            targetSubview?.backgroundColor = .white
        }
        else {
            self.thumbTintColor = .yellow
            targetSubview?.backgroundColor = .black
        }
    }
    
}

用法

代码语言:javascript
运行
复制
let customSwitch = CustomSwitch()
self.view.addSubview(customSwitch)
customSwitch.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    customSwitch.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
    customSwitch.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67833569

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档