Swift:UISegmentedControl的选定段中的背景颜色更改

问题描述 投票:5回答:7

在我的Swift应用程序中,我不知道如何在UISegmentControl中单独更改选定段的BGColor。我尝试了很多,只有色调正在改变。我在Objective - C中取得了成功。我不知道如何将其转换为SWIFT。请指导我。我的编码如下:

目标C.

- (IBAction)mySeg:(UISegmentedControl *)sender {

    for (int i=0; i<[sender.subviews count]; i++)
    {
        if ([[sender.subviews objectAtIndex:i]isSelected] )
        {
            UIColor *tintcolor=[UIColor colorWithRed:255.0/255.0 green:0/255.0 blue:0/255.0 alpha:1.0];
            [[sender.subviews objectAtIndex:i] setTintColor:tintcolor];  //HERE SELECTED SEGMENT COLOR ALONE CHANGING
        }
        else
        {
            [[sender.subviews objectAtIndex:i] setTintColor:nil];
        }
    }
}

迅速

@IBAction func mySegAcn(sender: UISegmentedControl) {
for(var i : Int = 0; i < sender.subviews.count; i++)
{
    if((sender.subviews[i].isSelected) != nil) 
    {
        //var tint_Color =  UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)

        (sender.subviews[i] as! UIView).tintColor = UIColor .redColor()  //HERE WHOLE TINT COLOR IS CHANGING
    }

    else
    {

        (sender.subviews[i] as! UIView).tintColor = nil
    }
}
}

产量

enter image description here

swift uisegmentedcontrol
7个回答
2
投票

Swift代码的问题是可选的处理:即使(sender.subviews[i].isSelected) != nil为假,isSelected也会成立。

尝试使用Swift语法编写循环

for subview in (sender.subviews as! [UIView]) {
   if (subview.isSelected) {
       subview.tintColor = UIColor.redColor()
   } 
   else {
       subview.tintColor = nil
   } 
}

至少在该循环中,您实际上正在测试是否选择子视图而不是视图是否为零。


11
投票

我尝试使用isSelected,它给出了一个错误,说该方法不存在。这是另一种没有isSelected方法的方法

使用值更改事件为UISegmentControl按行的x值按顺序对段进行排序,然后循环并比较selectedSegmentIndex属性。这是一个假设分段控制4个段的示例:

@IBAction func indexChanged(sender: UISegmentedControl) {

    let sortedViews = sender.subviews.sort( { $0.frame.origin.x < $1.frame.origin.x } )

    for (index, view) in sortedViews.enumerate() {
        if index == sender.selectedSegmentIndex {
            view.tintColor = UIColor.blueColor()
        } else {
            view.tintColor = UIColor.lightGrayColor()
        }
    }

}

然后在viewDidLoad中为最初选择的段设置tintColor,在这种情况下它是第一个:

let sortedViews = segmentedControlOutletVariable.subviews.sort( { $0.frame.origin.x < $1.frame.origin.x } )
sortedViews[0].tintColor = UIColor.blueColor()

3
投票

斯威夫特4

let sortedViews = segmentedControl.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )

for (index, view) in sortedViews.enumerated() {
    if index == segmentedControl.selectedSegmentIndex {
        view.tintColor = UIColor.red
    } else {
        view.tintColor = UIColor.green
    }
}

1
投票

根据@MiKL的建议,以下代码工作正常。

for(var i : Int = 0; i < sender.subviews.count; i++)
        {
            if ((sender.subviews[i].isSelected) == true)
            {
                (sender.subviews[i] as! UIView).tintColor = UIColor .redColor()
            }
            else
            {
                (sender.subviews[i] as! UIView).tintColor = nil
            }
        }

0
投票

您的更改颜色代码工作正常,唯一的问题是如果条件不能以相同的方式工作在目标c中。

如果条件改变

 if(sender.selectedSegmentIndex != i)

@IBAction func action(sender: UISegmentedControl) {
    for(var i : Int = 0; i < sender.subviews.count; i++)
    {
        if(sender.selectedSegmentIndex != i)
        {
            //var tint_Color =  UIColor(red: 1.0, green: 0, blue: 0, alpha: 1.0)

            (sender.subviews[i] as! UIView).tintColor = UIColor .redColor()

            //HERE WHOLE TINT COLOR IS CHANGING
        }

        else
        {

            (sender.subviews[i] as! UIView).tintColor = nil
        }
    }
}

0
投票

对于Swift:单击分段控制(@IBAction)使用以下代码

@IBAction func segmentChanged(sender: UISegmentedControl) {
    let sortedSubViews = sender.subviews.sort { $0.frame.minX < $1.frame.minX }
    let selectedSegment = sortedSubViews[sender.selectedSegmentIndex]
    sortedSubViews.forEach({
        // white is selected color and cayan color is for not selected item 
        $0.tintColor = $0 == selectedSegment ? UIColor.whiteColor() : UIColor.cyanColor()
    })
}

创建segmentedControl的出口,在viewDidLoad上你需要调用上面的函数。

self.segmentChanged(segmentedControl)

0
投票

更新Swift 4.1中的@gabo答案,因为我没有权限修改他的答案。

@IBAction func indexChanged(sender: UISegmentedControl) { 

     let sortedViews = sender.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )

            for (index, view) in sortedViews.enumerated() {
                if index == sender.selectedSegmentIndex { //When selected
                    view.tintColor = UIColor.blue
                } else {//Unselected
                    view.tintColor = nil
                }
            }

}

最初在viewDidLoad中选择的段

let sortedViews = segmentedControlOutletVariable.subviews.sorted( by: { $0.frame.origin.x < $1.frame.origin.x } )
sortedViews[0].tintColor = UIColor.blue //Default Selection color
© www.soinside.com 2019 - 2024. All rights reserved.