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 的子视图,因此它继承了 属性。
我正在尝试创建一个自定义标签,它是 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 的子视图,因此它继承了 属性。