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

McD*_*_11 6 uisegmentedcontrol swift

在我的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];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

迅速

@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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

产量

在此输入图像描述

gab*_*abo 12

我尝试使用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()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

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

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


Abh*_*ain 5

斯威夫特 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
    }
}
Run Code Online (Sandbox Code Playgroud)


Vic*_*ius 5

iOS 13 和 Swift 5

尝试使用这个扩展:

extension UISegmentedControl {
    func setSelectedSegmentForegroundColor(_ foregroundColor: UIColor, andTintColor tintColor: UIColor) {
        if #available(iOS 13.0, *) {
            self.setTitleTextAttributes([.foregroundColor: foregroundColor], for: .selected)
            self.selectedSegmentTintColor = tintColor;
        } else {
            self.tintColor = tintColor;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

称呼:

segmentedControlName.setSelectedSegmentForegroundColor(.white, andTintColor: .black);
Run Code Online (Sandbox Code Playgroud)


MiK*_*iKL 2

Swift 代码的问题在于对可选值的处理: (sender.subviews[i].isSelected) != nil即使为isSelectedfalse,也会为 true。

尝试使用 Swift 语法编写循环

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

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

  • UIView 没有名为 *"isSelected"* 的成员。我已经尝试过这个,我遇到了这个错误。@MiKL (7认同)