单击已选择的段控制swift

时间:2015-12-29 14:45:12

标签: ios swift uisegmentedcontrol

我有一个UISegmentedControl,有4个细分。选中后,应该会弹出视图。当弹出窗口被解雇,并试图点击相同的段索引时,它应该再次显示弹出窗口。弹出消失后,使用以下内容对点击同一段索引没有任何操作。

segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .AllEvents)

segHeader.addTarget(self, action: Selector("valuechange:"), forControlEvents: .ValueChanged)

4 个答案:

答案 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);
  }
}