在某些情况下,UISegmentControl下划线不在顶部

时间:2018-03-11 06:22:03

标签: swift uisegmentedcontrol

我正在尝试使用所选细分的下划线创建细分控件。我发现了一些代码片段,但它们似乎表现出相同的行为,其中下划线位于UISegment控件的UISegment之下。在这种特殊情况下,我使用的是UITeView自定义单元格,其UISegmentControl对单元格的顶部,左侧,底部和右侧角有约束。只有第二段正确显示。以下是调试视图层次结构的样子:

First segment - Underline in the wrong spot

Second segment - Underline in the right position

Third segment - Underline in the wrong spot again

以下是我正在使用的代码:

extension UISegmentedControl{
    func removeBorder(){
        let backgroundImage = UIImage.getColoredRectImageWith(color: UIColor.white.cgColor, andSize: self.bounds.size)
        self.setBackgroundImage(backgroundImage, for: .normal, barMetrics: .default)
        self.setBackgroundImage(backgroundImage, for: .selected, barMetrics: .default)
        self.setBackgroundImage(backgroundImage, for: .highlighted, barMetrics: .default)

        let deviderImage = UIImage.getColoredRectImageWith(color: UIColor.white.cgColor, andSize: CGSize(width: 1.0, height: self.bounds.size.height))
        self.setDividerImage(deviderImage, forLeftSegmentState: .selected, rightSegmentState: .normal, barMetrics: .default)
        self.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.gray], for: .normal)
        self.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor(red: 67/255, green: 129/255, blue: 244/255, alpha: 1.0)], for: .selected)
    }

    func addUnderlineForSelectedSegment(){
        removeBorder()
        let underlineWidth: CGFloat = self.bounds.size.width / CGFloat(self.numberOfSegments)
        let underlineHeight: CGFloat = 2.0
        let underlineXPosition = CGFloat(selectedSegmentIndex * Int(underlineWidth))
        let underLineYPosition = self.bounds.size.height - 5.0
        let underlineFrame = CGRect(x: underlineXPosition, y: underLineYPosition, width: underlineWidth, height: underlineHeight)
        let underline = UIView(frame: underlineFrame)
        underline.backgroundColor = UIColor(red: 67/255, green: 129/255, blue: 244/255, alpha: 1.0)
        underline.tag = 1
        self.addSubview(underline)
    }

    func changeUnderlinePosition(){
        guard let underline = self.viewWithTag(1) else {return}
        let underlineFinalXPosition = (self.bounds.width / CGFloat(self.numberOfSegments)) * CGFloat(selectedSegmentIndex)
        UIView.animate(withDuration: 0.1, animations: {
            underline.frame.origin.x = underlineFinalXPosition
        })
    }
}

任何人都有任何想法导致这个问题吗?

1 个答案:

答案 0 :(得分:0)

这感觉有点哈哈,但我更改了以下内容:

self.addSubview(underline)

以下内容:

for each in self.subviews {
    each.addSubview(underline)

现在,它运作正常。即使在调试视图层次结构中,我也只看到一个下划线UIView。奇怪。

仍然对可能是更好解决方案的任何其他答案感兴趣。