点击已经选中的段控件swift
Click on the already selected segment control swift
我有一个有 4 个片段的 UISegmentedControl
。选择后,它应该弹出视图。当弹出窗口消失,并尝试点击相同的段索引时,它应该再次显示弹出窗口。通过使用以下在弹出窗口关闭后对单击相同段索引没有任何操作。
segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .AllEvents)
或
segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .ValueChanged)
子类 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
的操作,但当多次触摸同一部分时,它会按预期运行。如果触发两次操作对您来说太昂贵,您可以尝试 "filter" 使用时间戳的事件。
如果我没理解错的话,您想pop/show选择分段控件时的视图对吗?
SWIFT 3
在那种情况下,你把事情搞得太复杂了,更容易使用:
viewName.isHidden = false/true
通过这种方式,您可以根据应用于分段控制索引的操作隐藏或显示 view/views。例如:
@IBAction func segmentedAction(_ sender: AnyObject) {
if segmentedControl.selectedSegmentIndex == 0 {
viewName.isHidden = false
}
else {
viewName.isHidden = true
}
}
经过大量研究我能够解决它。
我在这里写答案可能对以后的其他人有帮助。
当按下段控制时写下面的代码。
@IBAction func segHeaderPressed(发件人:UISegmentedControl){
如果segHeader.selectedSegmentIndex == 0{
让 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
//你的代码...
}否则如果(segHeader.selectedSegmentIndex == 1){
let sortedViews = sender.subviews.sort( { [=11=].frame.origin.x < .frame.origin.x } )
for (index, view) in sortedViews.enumerate() {
if index == sender.selectedSegmentIndex {
view.backgroundColor = iOSBlueColor //UIColor.blueColor()
} else {
view.backgroundColor = UIColor.clearColor()
}
}
// 你的代码...
}否则如果(segHeader.selectedSegmentIndex == 2){
让 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()
}
}
}否则如果(segHeader.selectedSegmentIndex == 3){
让 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()
}
}
}
}
基本上,分段控制功能是一旦选中它,如果您再次点击它,它将不会响应。所以我只是改变了所选部分的背景颜色。希望对大家有帮助。
我改进了特斯拉的 一点点。
如果您发送 .touchUpInside
事件并绑定它而不是 .valueChanged
,它在每种情况下只触发一次。
此外,您应该在touchesEnded
之后调用sendActions
函数。
如果不是,segmentedControl.selectedSegmentIndex
将 return 旧值。
class ClickableSegmentedControl: UISegmentedControl {
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event);
self.sendActions(for: UIControl.Event.touchUpInside);
}
}
我有一个有 4 个片段的 UISegmentedControl
。选择后,它应该弹出视图。当弹出窗口消失,并尝试点击相同的段索引时,它应该再次显示弹出窗口。通过使用以下在弹出窗口关闭后对单击相同段索引没有任何操作。
segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .AllEvents)
或
segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .ValueChanged)
子类 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
的操作,但当多次触摸同一部分时,它会按预期运行。如果触发两次操作对您来说太昂贵,您可以尝试 "filter" 使用时间戳的事件。
如果我没理解错的话,您想pop/show选择分段控件时的视图对吗?
SWIFT 3
在那种情况下,你把事情搞得太复杂了,更容易使用:
viewName.isHidden = false/true
通过这种方式,您可以根据应用于分段控制索引的操作隐藏或显示 view/views。例如:
@IBAction func segmentedAction(_ sender: AnyObject) {
if segmentedControl.selectedSegmentIndex == 0 {
viewName.isHidden = false
}
else {
viewName.isHidden = true
}
}
经过大量研究我能够解决它。
我在这里写答案可能对以后的其他人有帮助。
当按下段控制时写下面的代码。
@IBAction func segHeaderPressed(发件人:UISegmentedControl){
如果segHeader.selectedSegmentIndex == 0{
让 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
//你的代码... }否则如果(segHeader.selectedSegmentIndex == 1){
let sortedViews = sender.subviews.sort( { [=11=].frame.origin.x < .frame.origin.x } )
for (index, view) in sortedViews.enumerate() {
if index == sender.selectedSegmentIndex {
view.backgroundColor = iOSBlueColor //UIColor.blueColor()
} else {
view.backgroundColor = UIColor.clearColor()
}
}
// 你的代码... }否则如果(segHeader.selectedSegmentIndex == 2){
让 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()
}
}
}否则如果(segHeader.selectedSegmentIndex == 3){
让 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()
}
}
} }
基本上,分段控制功能是一旦选中它,如果您再次点击它,它将不会响应。所以我只是改变了所选部分的背景颜色。希望对大家有帮助。
我改进了特斯拉的
如果您发送 .touchUpInside
事件并绑定它而不是 .valueChanged
,它在每种情况下只触发一次。
此外,您应该在touchesEnded
之后调用sendActions
函数。
如果不是,segmentedControl.selectedSegmentIndex
将 return 旧值。
class ClickableSegmentedControl: UISegmentedControl {
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event);
self.sendActions(for: UIControl.Event.touchUpInside);
}
}