我有一个UISegmentedControl
,有4个细分。选中后,应该会弹出视图。当弹出窗口被解雇,并试图点击相同的段索引时,它应该再次显示弹出窗口。弹出消失后,使用以下内容对点击同一段索引没有任何操作。
segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .AllEvents)
或
segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .ValueChanged)
答案 0 :(得分:3)
经过大量研究后我能够解决它。
我在这里写答案可能会对其他人有所帮助。
当按下段控制时,写下代码。
@IBAction func segHeaderPressed(sender:UISegmentedControl){
如果segHeader.selectedSegmentIndex == 0 {
let sortedViews = sender.subviews.sort({$ 0.frame.origin.x< $ 1.frame.origin.x})
for (index, view) in sortedViews.enumerate() {
if index == sender.selectedSegmentIndex {
view.backgroundColor = iOSBlueColor // UIColor.blueColor()
} else {
view.backgroundColor = UIColor.clearColor()
}
}
selectedInd = -1
//你的代码...... } else if(segHeader.selectedSegmentIndex == 1){
let sortedViews = sender.subviews.sort( { $0.frame.origin.x < $1.frame.origin.x } )
for (index, view) in sortedViews.enumerate() {
if index == sender.selectedSegmentIndex {
view.backgroundColor = iOSBlueColor //UIColor.blueColor()
} else {
view.backgroundColor = UIColor.clearColor()
}
}
//你的代码...... } else if(segHeader.selectedSegmentIndex == 2){
let sortedViews = sender.subviews.sort({$ 0.frame.origin.x&lt; $ 1.frame.origin.x})
for (index, view) in sortedViews.enumerate() {
if index == sender.selectedSegmentIndex {
view.backgroundColor = iOSBlueColor //UIColor.blueColor()
} else {
view.backgroundColor = UIColor.clearColor()
}
}
}否则if(segHeader.selectedSegmentIndex == 3){
let sortedViews = sender.subviews.sort({$ 0.frame.origin.x&lt; $ 1.frame.origin.x})
for (index, view) in sortedViews.enumerate() {
if index == sender.selectedSegmentIndex {
view.backgroundColor = iOSBlueColor //UIColor.blueColor()
} else {
view.backgroundColor = UIColor.clearColor()
}
}
} }
基本上分段控制功能是一旦它被选中,如果你再次点击它不会响应。所以我只是改变所选片段的背景颜色。希望它可以帮助某人。
答案 1 :(得分:1)
子类UISegmentedControl
并覆盖touchesEnded
class DemoSegmentedControl: UISegmentedControl {
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
self.sendActionsForControlEvents(UIControlEvents.ValueChanged);
super.touchesEnded(touches, withEvent: event);
}
}
这有一个错误,当触摸不同的段时,它会触发UIControlEvents.ValueChanged
的两次动作,但是当多次触摸相同的段时,它将按预期运行。您可以尝试过滤&#34;过滤&#34;使用时间戳的事件,如果两次触发动作对你来说太贵了。
答案 2 :(得分:1)
如果我理解正确,你想在选择分段控件时弹出/显示视图吗?
SWIFT 3
在这种情况下,你过于复杂,更容易使用:
viewName.isHidden = false / true
这样,您可以隐藏或显示基于应用于分段控制索引的操作的视图/视图。例如:
@IBAction func segmentedAction(_ sender:AnyObject){
if segmentedControl.selectedSegmentIndex == 0 {
viewName.isHidden = false
}
else {
viewName.isHidden = true
}
}
答案 3 :(得分:0)
我改进了特斯拉的answers。
如果您发送.touchUpInside
事件并绑定它而不是.valueChanged
,则在每种情况下它仅触发一次。
此外,您应该在sendActions
之后调用touchesEnded
函数。
否则,segmentedControl.selectedSegmentIndex
将返回旧值。
class ClickableSegmentedControl: UISegmentedControl {
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event);
self.sendActions(for: UIControl.Event.touchUpInside);
}
}