UISegmentedControl iOS 13 clear color

前端 未结 1 740
面向向阳花
面向向阳花 2020-12-31 20:42

On iOS 12, to get a UISegmentedControl with clear border, clear divider line, everything clear was easy. All I did was this:

  settingControl.tintColor = .cl         


        
相关标签:
1条回答
  • 2020-12-31 21:34

    Here's a way to replicate that plain segmented control in iOS 13:

    import UIKit
    import PlaygroundSupport
    
    class PlainSegmentedControl: UISegmentedControl {
        override init(items: [Any]?) {
            super.init(items: items)
    
            setup()
        }
    
        override init(frame: CGRect) {
            super.init(frame: frame)
        }
    
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
        // Used for the unselected labels
        override var tintColor: UIColor! {
            didSet {
                setTitleTextAttributes([.foregroundColor: tintColor!, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
            }
        }
    
        // Used for the selected label
        override var selectedSegmentTintColor: UIColor? {
            didSet {
                setTitleTextAttributes([.foregroundColor: selectedSegmentTintColor ?? tintColor!, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .selected)
            }
        }
    
        private func setup() {
            backgroundColor = .clear
    
            // Use a clear image for the background and the dividers
            let tintColorImage = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
            setBackgroundImage(tintColorImage, for: .normal, barMetrics: .default)
            setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
    
            // Set some default label colors
            setTitleTextAttributes([.foregroundColor: UIColor.black, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
            setTitleTextAttributes([.foregroundColor: tintColor!, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .selected)
        }
    }
    

    Here's some test code to put in a playground:

    // Create a dark green view as a test background
    let bg = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 100))
    bg.backgroundColor = UIColor(red: 0.224, green: 0.408, blue: 0.467, alpha: 1)
    
    // The plain segmented control
    let seg = PlainSegmentedControl(items: ["Number One", "Number Two", "Number Three"])
    seg.tintColor = .white
    seg.selectedSegmentTintColor = .green
    seg.selectedSegmentIndex = 0
    bg.addSubview(seg)
    PlaygroundPage.current.liveView = bg
    

    Here's the UIImage extension to create a sized image from a color:

    extension UIImage {
        convenience init(color: UIColor, size: CGSize) {
            UIGraphicsBeginImageContextWithOptions(size, false, 1)
            color.set()
            let ctx = UIGraphicsGetCurrentContext()!
            ctx.fill(CGRect(origin: .zero, size: size))
            let image = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
    
            self.init(data: image.pngData()!)!
        }
    }
    
    0 讨论(0)
提交回复
热议问题