2015-07-27 3 views
7

как удалить внешнюю границу сегментированного элемента управления в xcode? Я установил изображение разделителя на то, что хотел, но теперь, чтобы следить за макетом моего приложения, мне нужно иметь сегментированный элемент управления без внешней границы.Swift: Как удалить границу из сегментированного элемента управления

ответ

25

Вы можете удалить обе границы и разделители, используя приведенную ниже функцию. Создать расширение UISegmentedControl:

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 
    } 
} 

For Swift 3:

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! 
    } 
} 

Вызов выше функции.

segmentedControl.removeBorders() 

Ссылка: Remove UISegmentedControl separators completely. (iphone)

Благодаря https://stackoverflow.com/users/3921490/amagain для Swift 3 версии.

+0

Спасибо :) Он работал = D Но еще один вопрос, это сделает мое сегментированное управление имеет острый прямоугольный угол, любые способы, чтобы сделать он округлен? – Happiehappie

+0

@Happiehappie нет, вы не можете, пожалуйста, обратитесь к этому ответу http://stackoverflow.com/questions/1834244/uisegmentedcontrol-without-rounded-corner –

+0

Я получаю «фатальную ошибку: неожиданно обнаружен нуль при развертывании необязательного значения» в строке 'setBackgroundImage (imageWithColor (color: backgroundColor!), для: .normal, barMetrics: .default)' – Kakaji

9

Вот быстрый ответ Sohil, который может помочь кому-то еще. Это помогло мне. :)

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! 
    } 
} 
1

Если вы хотите сохранить границы между ячейками

extension UISegmentedControl { 
    func removeBorders() { 
    if let backgroundColor = backgroundColor, let backgroundImage = UIImage.imageWithSize(size: CGSize.one_one, color: backgroundColor){ 
     setBackgroundImage(backgroundImage, for: .normal, barMetrics: .default) 
    } 

    if let tintColor = tintColor, let tintImage = UIImage.imageWithSize(size: CGSize.one_one, color: tintColor){ 
     setBackgroundImage(tintImage, for: .selected, barMetrics: .default) 
     setDividerImage(tintImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default) 
    } 
    } 
} 

extension CGSize{ 
    static var one_one: CGSize{ 
    return CGSize(width: 1.0, height: 1.0) 
    } 
} 

extension UIImage{ 
    static func imageWithSize(size : CGSize, color : UIColor = UIColor.white) -> UIImage? { 
    var image:UIImage? = nil 
    UIGraphicsBeginImageContext(size) 
    if let context = UIGraphicsGetCurrentContext() { 
     context.setFillColor(color.cgColor) 
     context.addRect(CGRect(origin: CGPoint.zero, size: size)); 
     context.drawPath(using: .fill) 
     image = UIGraphicsGetImageFromCurrentImageContext(); 
    } 
    UIGraphicsEndImageContext() 
    return image 
    } 
} 
Смежные вопросы