UiSegmentedControl 作为 UILabel 子类的一部分

UiSegmentedControl as part of UILabel Subclass

我正在尝试创建一个自定义标签,它是 UILabel 的子类并具有 UISegmentedControl 属性。本质上,我正在尝试创建一个自定义按钮。

视图和约束已很好地添加到父视图,但 UISegmentedControl 不响应触摸。下面是我如何尝试使用它的代码片段。我尝试启用 isUserInteractionEnabled 作为完整性检查,但没有任何反应。

class CustomLabelWithSelector: CustomLabel {
    
    var selector: UISegmentedControl!
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override init(with title: String) {
        super.init(with: title)
        
        selector = UISegmentedControl(frame: .zero)
        selector.insertSegment(withTitle: "Off", at: 0, animated: true)
        selector.insertSegment(withTitle: "On", at: 1, animated: true)
        selector.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.white], for: .normal)
        selector.selectedSegmentTintColor = .systemGray
        selector.backgroundColor = .tertiarySystemFill
        selector.selectedSegmentIndex = 0
        selector.translatesAutoresizingMaskIntoConstraints = false
        
        self.addSubview(selector)
        selectorConstraints()
    }
    
    private func selectorConstraints() {
        
        selector.centerYAnchor.constraint(equalTo: self.centerYAnchor).isActive = true
        selector.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -5).isActive = true
    }
}

class ViewController: UIViewController {
    var customLabelWithSelector: CustomLabelWithSelector!
    init() {
        self.setUpView()
    }

    func setupView() {
        customLabelWithSelector = CustomLabelWithSelector(with: "  Option")
        view.addSubview(customLabelWithSelector)
        // Label does not respond to touch, nor is the function called below
        customLabelWithSelector.selector.addTarget(self, action: #selector(selectOnOff(_:)), for: .valueChanged)
    }

    @objc func selectOnOff(_ segmentedControl: UISegmentedControl) {
            switch (segmentedControl.selectedSegmentIndex) {
              case 0:
                print("off selected")
                  break
              case 1:
                print("on selected")
                  break
              default:
                print("default")
                  break
          }
    } 
}

我还自己对 UISegmentedControl 进行了子类化,并成功地将其作为子视图添加到父 UIView 中。它没有响应触摸(从关闭切换到打开)也没有调用该功能。

我错过了什么吗?我可能不太了解视图层次结构,但我也尝试将 UISegmentedControl 视图放在前面,但也没有用。

关于如何实现这个有什么建议吗?

您可能需要

self.isUserInteractionEnabled = true

并为 customLabelWithSelector

设置框架
customLabelWithSelector = CustomLabelWithSelector(with: "  Option")
customLabelWithSelector.frame = //// set frame or constraints

顺便说一句,您可能需要直接使用细分而不使用子分类标签,因为您似乎没有从中受益

我的根本误解是 UILabel 将 isUserInteractionEnabled 值的默认值更改为 false。根据 UILabel and UIView

的 Apple 文档

简而言之,由于 UILabel(及其子类)默认将该值设置为 false,并且 UISegmentedControl 是 UILabel 的子视图,因此它继承了 属性。