【问题标题】:Changing the tint color for only the selected segment in swift快速更改仅选定段的色调颜色
【发布时间】:2020-02-11 19:39:11
【问题描述】:

我正在从 Objective-C 快速重新执行我的一个项目,并且我在 Objective-C 中使用了一个无法正确翻译的函数。

这是 Objective-C 代码

- (void)segmentAction:(UISegmentedControl *)sender
{
    NSLog(@"Segment");

    for (int e=0; e<[sender.subviews count]; e++) {
        if ([[sender.subviews objectAtIndex:e]isSelected]) {

            [[sender.subviews objectAtIndex:e] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"gradient.png"]]];
        } else {
            [[sender.subviews objectAtIndex:e] setTintColor:nil];
        }
    }
}

这就是我在swift中的位置

func segChanged(sender: UISegmentedControl) {
    println("Value Changed")
    var e:Int = 0
    var countOfSeg = sender.subviews.count
    for (e=0; e < countOfSeg; e++) {

    }

    print(sender.subviews[e]) 
}

它不会让我将 .selected 放在 sender.subviews[e] 的末尾用于 if 语句。

【问题讨论】:

    标签: ios swift uisegmentedcontrol


    【解决方案1】:

    subviews 是一个 AnyObjects 数组,因此您需要先将每个项目转换为 UIControl,然后才能引用其 selected 属性:

    for item in control.subviews {
        if let subview = item as? UIControl {
            if subview.selected {
                ...
            }
        }
    }
    

    编辑:这可以编译,但在运行时不起作用。在 iOS 8 中,控件的子视图看起来像是私有 UISegment 类的实例,它实际上是 UIImageView 的子类。将每个项目强制转换为 UIControl 的尝试将静默失败。我还没有完成您正在尝试的操作,因此不确定为什么这在 iOS 7 中有效。Apple 更改了 UISegmentedControl 的构建方式,或者 UIImageView 具有私有 selected 属性。我建议您以其他方式实现此效果,这可能意味着构建分段控件的自定义版本。如果您真的想继续使用内部子视图,请将“UIControl”更改为“UIImageView”并将“if subview.selected...”更改为“if subview.highlighted...”。请记住,这可能不适用于 iOS 7,并且可能会在更高版本的 iOS 中再次中断。

    【讨论】:

    • subview.selected 不适合我
    • 我的错 - 选择的是 UIControl 上的属性,而不是 UIView。我已经更新了我的答案。
    • 我遇到了麻烦,我该把这个放在哪里?
    • 它也不会越过 if let subview 行
    • 我的回复不适合作为评论,因此我已将其添加到答案下方。
    【解决方案2】:

    试试下面的代码

    let sortedViews = segmentedControl.subviews.sort( { $0.frame.origin.x < $1.frame.origin.x } )
            for (index, view) in sortedViews.enumerate() {
                if index == segmentedControl.selectedSegmentIndex {
                    view.tintColor = UIColor(red: 17/255, green: 125/255, blue: 185/255, alpha: 1)
                } else {
                    view.tintColor = UIColor.blackColor()
                }
            }
    

    【讨论】:

      【解决方案3】:

      这对我有用。试试这个:)

          self.segmentcontrol.selectionStyle = .box;
          self.segmentcontrol.selectionIndicatorBoxColor = UIColor.blue
      

      要使选择指示器颜色与框颜色相同,请执行此操作。

          self.segmentcontrol.selectionIndicatorColor = UIColor.blue
      

      【讨论】:

        【解决方案4】:

        swift 5 的更新版本 让 sortedViews = sender.subviews.sorted(by: { $0.frame.origin.x

            for (index, view) in sortedViews.enumerated() {
                if index == sender.selectedSegmentIndex {
                    view.tintColor = UIColor.blue //UIColor.blueColor()
                } else {
                    view.tintColor = UIColor.white
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2014-09-25
          • 1970-01-01
          • 2019-12-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-07
          • 2015-01-20
          相关资源
          最近更新 更多