【问题标题】:UISegmentedControl not changing when app theme is being changed?更改应用程序主题时 UISegmentedControl 不会更改?
【发布时间】:2018-08-10 19:12:15
【问题描述】:

我正在尝试为一个应用创建 2 个主题 - 浅色和深色。

在它们之间切换时,UISegmentedControl 不会被更改。它保持原始状态。不知道为什么。我确定我错过了什么或做错了什么,我只是不知道是什么。

class DiscoverVC: UIViewController {

     @IBOutlet weak var segmentedControl: UISegmentedControl!

     override func viewDidLoad() {
         super.viewDidLoad()
         segmentedControl.addUnderlineForSelectedSegment()
     }

     override func viewWillAppear(_ animated: Bool) {
         super.viewWillAppear(animated)
         applyTheme()
     }
}

extension DiscoverVC {

    fileprivate func applyTheme() {
         segmentedControl.tintColor = Theme.current.tint
    }
}



extension UISegmentedControl{

func removeBorder() {
        let backgroundImage = UIImage.getColoredRectImageWith(color: UIColor.clear.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.clear.cgColor, andSize: CGSize(width: 1.0, height: self.bounds.size.height))
        self.setDividerImage(deviderImage, forLeftSegmentState: .selected, rightSegmentState: .normal, barMetrics: .default)
        self.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: Theme.current.segmentedControl_unselectedColor, NSAttributedStringKey.font: UIFont(name: Fonts.OpenSans_Regular, size: 13)!], for: .normal)
        self.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: Theme.current.segmentedControl_tintColor, NSAttributedStringKey.font: UIFont(name: Fonts.OpenSans_Bold, size: 13)!], 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 - 1.0
        let underlineFrame = CGRect(x: underlineXPosition, y: underLineYPosition, width: underlineWidth, height: underlineHeight)
        let underline = UIView(frame: underlineFrame)
        underline.backgroundColor = Theme.current.segmentedControl_tintColor
        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
        })
    }
}

【问题讨论】:

    标签: ios swift uisegmentedcontrol


    【解决方案1】:

    在这个 removeBorder 函数中,您将从 SegmentedControl 中删除所有内容(边框、文本颜色、分隔符等)

    那么设置tint color会改变什么颜色呢?一切都有图像。

    我不确定,如果这是唯一的原因。您应该尝试对此发表评论并检查色调是否适用。

    func addUnderlineForSelectedSegment() {
        //removeBorder()
        YOUR Existing CODE HERE   
    }
    

    试试看,如果是这个原因。

    另外,请确认您是否从 Theme.current.tint 获取颜色值。

    【讨论】:

    • removeBorder() 实际上移除了每个分段控制元素周围的边框。没有它,它是默认的UISegmentedControl 加上下划线,但重点是将该默认 UI 更改为下划线。
    • 当您删除边框和分隔符并添加下划线时。同样可以实现自定义 UI,带有两个按钮和一个用于下划线的视图。然后在设置正确的插座后,您可以根据所选主题将颜色设置为按钮。
    【解决方案2】:

    它的工作令人惊讶。试试这个代码。 斯威夫特 4

    segment.tintColor = #colorLiteral(red: 0.7450980544, green: 0.1568627506, blue: 0.07450980693, alpha: 1)
    

    必须检查您的主题当前颜色。

    【讨论】:

    • 我设置的色调有效。那不是重点。它应该在我拥有的明暗主题之间来回切换。问题是,一旦视图控制器被加载,它就永远不会改变分段控件的颜色主题。
    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多