点击已经选中的段控件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);
  }
}