How to remove border from segmented control

后端 未结 9 2129
刺人心
刺人心 2020-12-03 05:04

How do I remove the outside border of a segmented control? I\'ve set the divider image to what I wanted but now to follow the mock of my app I need to have a segmented cont

相关标签:
9条回答
  • 2020-12-03 05:54

    What you must understand is the backgroundColor property is not stateful. Hence you have to use setBackgroundImage(_:for:barMetrics:).

    We can easily remove both borders and dividers using the below function.

    For Swift 3 & 4+:

    extension UISegmentedControl {
        func removeBorders() {
            setBackgroundImage(imageWithColor(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
            setBackgroundImage(imageWithColor(color: tintColor!), for: .selected, barMetrics: .default)
            setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
        }
    
        // create a 1x1 image with this color
        private func imageWithColor(color: UIColor) -> UIImage {
            let rect = CGRect(x: 0.0, y: 0.0, width:  1.0, height: 1.0)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            context!.setFillColor(color.cgColor);
            context!.fill(rect);
            let image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return image!
        }
    }
    

    For Swift 2.2:

    extension UISegmentedControl {
        func removeBorders() {
            setBackgroundImage(imageWithColor(backgroundColor!), forState: .Normal, barMetrics: .Default)
            setBackgroundImage(imageWithColor(tintColor!), forState: .Selected, barMetrics: .Default)
            setDividerImage(imageWithColor(UIColor.clearColor()), forLeftSegmentState: .Normal, rightSegmentState: .Normal, barMetrics: .Default)
        }
    
        // create a 1x1 image with this color
        private func imageWithColor(color: UIColor) -> UIImage {
            let rect = CGRectMake(0.0, 0.0, 1.0, 1.0)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()
            CGContextSetFillColorWithColor(context, color.CGColor);
            CGContextFillRect(context, rect);
            let image = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            return image
        }
    }
    

    Call the above function.

    segmentedControl.removeBorders()
    

    Reference: Remove UISegmentedControl separators completely. (iphone)

    Thanks to https://stackoverflow.com/users/3921490/amagain for Swift 3 version.

    0 讨论(0)
  • 2020-12-03 05:54
    • The accepted answer works for getting rid of the border.
    • The solution mentioned here also works for disabling the segmented Control.

    Yet putting the two solutions together, I wasn't able to get the correct selected segment in a disabled state.

    What I wanted was that upon selecting a segment and making a network call, I wanted to disable the segmented control.

    The outcome was like this:

    What was desired was this:

    The only addition to Sohil's solution is:

    setBackgroundImage(imageWithColor(color: imageWithColor(color: tintColor)), for: [.selected, .disabled], barMetrics: .default)
    

    After the selected && disabled segment will have the right color.

    0 讨论(0)
  • 2020-12-03 06:01

    Here's the swift 3 version of Sohil's answer that might help someone else. It did help me. :)

    extension UISegmentedControl {
    func removeBorders() {
        setBackgroundImage(imageWithColor(color: backgroundColor!), for: .normal, barMetrics: .default)
        setBackgroundImage(imageWithColor(color: tintColor!), for: .selected, barMetrics: .default)
        setDividerImage(imageWithColor(color: UIColor.clear), forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
    }
    
    // create a 1x1 image with this color
    private func imageWithColor(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0.0, y: 0.0, width:  1.0, height: 1.0)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context!.setFillColor(color.cgColor);
        context!.fill(rect);
        let image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return image!
        }
    }
    
    0 讨论(0)
提交回复
热议问题