Как изменить цвета сегмента в UISegmentedControl в iOS 13?

110

A UISegmentedControlимеет новый внешний вид в iOS 13, и существующий код для изменения цветов сегментированного элемента управления больше не работает так, как раньше.

До iOS 13 вы могли установить tintColorи, которые будут использоваться для границы вокруг сегментированного элемента управления, линий между сегментами и цвета фона выбранного сегмента. Затем вы можете изменить цвет заголовков каждого сегмента, используя атрибут цвета переднего плана с titleTextAttributes.

Под iOS 13 tintColorничего не делает. Вы можете настроить сегментированный элемент управления, backgroundColorчтобы изменить общий цвет сегментированного элемента управления. Но я не могу найти способ изменить цвет, используемый в качестве фона выбранного сегмента. Настройка текстовых атрибутов все еще работает. Я даже попытался установить цвет фона заголовка, но это влияет только на фон заголовка, а не на остальную часть цвета фона выбранного сегмента.

Короче говоря, как изменить цвет фона текущего выбранного сегмента UISegmentedControlв iOS 13? Есть ли подходящее решение, использующее общедоступные API-интерфейсы, для которого не требуется копаться в частной структуре подпредставления?

В iOS 13 нет новых свойств UISegmentedControlили UIControlизменений, внесенных в UIViewнего.

мэдди
источник

Ответы:

134

На прошивке 13b3, есть теперь selectedSegmentTintColorна UISegmentedControl.

Чтобы изменить общий цвет сегментированного элемента управления, используйте его backgroundColor.

Для изменения цвета выделенного сегмента используйте selectedSegmentTintColor.

Чтобы изменить цвет / шрифт заголовков невыделенных сегментов, используйте setTitleTextAttributesс состоянием .normal/ UIControlStateNormal.

Чтобы изменить цвет / шрифт заголовков выбранных сегментов, используйте setTitleTextAttributes с состоянием .selected/ UIControlStateSelected.

Если вы создаете сегментированный элемент управления с изображениями, если изображения создаются как изображения-шаблоны, то сегментированный элемент управления tintColorбудет использоваться для раскрашивания изображений. Но с этим есть проблема. Если вы установите тот tintColorже цвет, что и selectedSegmentTintColorтогда, изображение не будет видно в выбранном сегменте. Если вы установитеtintColor же цвет, что и backgroundColor, то изображения в невыделенных сегментах не будут видны. Это означает, что ваш сегментированный элемент управления с изображениями должен использовать 3 разных цвета, чтобы все было видно. Или вы можете использовать изображения, не являющиеся шаблонами, и не устанавливать расширение tintColor.

В iOS 12 или более ранней версии просто установите сегментированный элемент управления tintColorили полагайтесь на общий цвет оттенка приложения.

мэдди
источник
Как установить контроллер сегмента без границ? Я не вижу настройки для этого в iOS 13. Раньше настройки tintcolor было достаточно, чтобы получить элемент управления сегментом без полей.
Дипак Шарма
Пожалуйста, добавьте цвет границы и т. Д., Чтобы все могли найти здесь все проблемы, связанные с цветом сегмента. что сказать? :)
Йогеш Патель
1
@YogeshPatel А как насчет цвета границы? В iOS 13 нет цвета границы, а в iOS 12 он установлен, tintColorчто уже описано в ответе.
rmaddy
@rmaddy Я установил этот [segmentedControl.layer setBorderColor: [[UIColor whiteColor] CGColor]]; [segmentedControl.layer setBorderWidth: 0,5]; он дает мне границу и цвет границы в iOS 13.
Йогеш Патель
1
Ох уж эта граница. Это применимо к любому представлению, а не только к сегментированному элементу управления. Это выходит за рамки исходного вопроса и этого ответа. Твоего комментария достаточно.
rmaddy
48

Начиная с Xcode 11 beta 3

Есть теперь selectedSegmentTintColorсобственность на UISegmentedControl.

См . Ответ rmaddy


Чтобы вернуть внешний вид iOS 12

Мне не удалось изменить цвет выбранного сегмента, надеюсь, это будет исправлено в предстоящей бета-версии.

Установка фонового изображения выбранного состояния не работает без установки фонового изображения нормального состояния (что удаляет все стили iOS 13)

Но мне удалось вернуть его к внешнему виду iOS 12 (или достаточно близко, я не смог вернуть радиус угла до меньшего размера).

Это не идеально, но ярко-белый сегментированный элемент управления выглядит немного неуместно в нашем приложении.

(Не осознавал, UIImage(color:)что в нашей кодовой базе есть метод расширения. Но код для его реализации есть в сети)

extension UISegmentedControl {
    /// Tint color doesn't have any effect on iOS 13.
    func ensureiOS12Style() {
        if #available(iOS 13, *) {
            let tintColorImage = UIImage(color: tintColor)
            // Must set the background image for normal to something (even clear) else the rest won't work
            setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
            setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
            setTitleTextAttributes([.foregroundColor: tintColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
            setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
            layer.borderWidth = 1
            layer.borderColor = tintColor.cgColor
        }
    }
}

Изображение, показывающее эффект приведенного выше кода

Джонатан.
источник
Это может быть хорошим решением. У меня еще не было возможности попробовать это, но требуется ли для этого также вызов, setTitleTextAttributesчтобы сделать заголовок выбранного сегмента белым цветом?
rmaddy 05
Хм, похоже, должно быть, но вроде бы нет. У меня нет доступа к банкомату с использованием этого кода, но изображение слева создано с помощью этого кода.
Джонатан.
8
stackoverflow.com/a/33675160/5790492 для расширения UIImage (color :).
Ник Ков
1
Было бы неплохо, если бы вы добавили расширение UIImage, таким образом, ваш ответ не будет полным
iho
1
@VityaShurapov - его настройка, когда он и выделен, и выбран, это не массив переданных состояний, а скорее набор параметров, что означает, что значения объединяются для создания нового состояния.
Джонатан.
37

IOS 13 и Swift 5.0 (Xcode 11.0) Управление сегментами 100% работает

введите описание изображения здесь

введите описание изображения здесь

 if #available(iOS 13.0, *) {
      yoursegmentedControl.backgroundColor = UIColor.black
      yoursegmentedControl.layer.borderColor = UIColor.white.cgColor
      yoursegmentedControl.selectedSegmentTintColor = UIColor.white
      yoursegmentedControl.layer.borderWidth = 1

      let titleTextAttributes = [NSAttributedString.Key.foregroundColor: UIColor.white]    
      yoursegmentedControl.setTitleTextAttributes(titleTextAttributes, for:.normal)

      let titleTextAttributes1 = [NSAttributedString.Key.foregroundColor: UIColor.black]
      yoursegmentedControl.setTitleTextAttributes(titleTextAttributes1, for:.selected)
  } else {
              // Fallback on earlier versions
}
Маулик Патель
источник
8
вы пробовали установить белый фон? для меня он становится серым
Ронит
@ItanHant, какой язык xcode и Swift вы используете?
Маулик Патель,
@Ronit конечно же !! Я попробую, но, пожалуйста, скажите мне, какой тип вывода отображается сейчас
Маулик Патель
swift 5, xcode 11.3! он показывает, чего хочет! не тот, кого я хочу :)
Итан Хант
16

Я пробовал обходной путь, и он отлично мне подходит. Вот версия Objective-C:

@interface UISegmentedControl (Common)
- (void)ensureiOS12Style;
@end
@implementation UISegmentedControl (Common)
- (void)ensureiOS12Style {
    // UISegmentedControl has changed in iOS 13 and setting the tint
    // color now has no effect.
    if (@available(iOS 13, *)) {
        UIColor *tintColor = [self tintColor];
        UIImage *tintColorImage = [self imageWithColor:tintColor];
        // Must set the background image for normal to something (even clear) else the rest won't work
        [self setBackgroundImage:[self imageWithColor:self.backgroundColor ? self.backgroundColor : [UIColor clearColor]] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:tintColorImage forState:UIControlStateSelected barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:[self imageWithColor:[tintColor colorWithAlphaComponent:0.2]] forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault];
        [self setBackgroundImage:tintColorImage forState:UIControlStateSelected|UIControlStateSelected barMetrics:UIBarMetricsDefault];
        [self setTitleTextAttributes:@{NSForegroundColorAttributeName: tintColor, NSFontAttributeName: [UIFont systemFontOfSize:13]} forState:UIControlStateNormal];
        [self setDividerImage:tintColorImage forLeftSegmentState:UIControlStateNormal rightSegmentState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
        self.layer.borderWidth = 1;
        self.layer.borderColor = [tintColor CGColor];
    }
}

- (UIImage *)imageWithColor: (UIColor *)color {
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *theImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return theImage;
}
@end
Колин Блейк
источник
2
Я не уверен, что он будет работать CGRectMake(0.0f, 0.0f, 1.0f, 1.0f): из моих тестов с бета-версией Xcode 11 rectдолжен был быть того же размера, что и границы сегментированного элемента управления.
Cœur
2
Начиная с iOS13 beta 6 цвет оттенка не отображался на выбранной кнопке, поэтому мне пришлось добавить строку: [self setTitleTextAttributes: @ {NSForegroundColorAttributeName: UIColor.blackColor, NSFontAttributeName: [UIFont systemFontOfSize: 13]} forState: UIControlSelected;
Питер Джонсон
Когда я пытаюсь использовать это, [[UISegmentedControl appearance] ensureiOS12Style]я получаю исключение. Есть идеи, что происходит? Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
Джереми Хикс,
13

Начиная с Xcode 11 beta 3

Есть теперь selectedSegmentTintColorсобственность на UISegmentedControl.

Спасибо @rmaddy!


Оригинальный ответ для Xcode 11 beta и beta 2

Есть ли подходящее решение, использующее общедоступные API-интерфейсы, для которого не требуется копаться в частной структуре подпредставления?

С бета-версией Xcode 11.0 кажется сложной задачей сделать это по правилам, потому что в основном требуется перерисовывать все фоновые изображения для каждого состояния самостоятельно, с закругленными углами, прозрачностью и resizableImage(withCapInsets:). Например, вам нужно будет создать цветное изображение, подобное:
введите описание изображения здесь

Так что на данный момент способ «давайте копаться в подпредставлениях» кажется намного проще:

class TintedSegmentedControl: UISegmentedControl {

    override func layoutSubviews() {
        super.layoutSubviews()

        if #available(iOS 13.0, *) {
            for subview in subviews {
                if let selectedImageView = subview.subviews.last(where: { $0 is UIImageView }) as? UIImageView,
                    let image = selectedImageView.image {
                    selectedImageView.image = image.withRenderingMode(.alwaysTemplate)
                    break
                }
            }
        }
    }
}

Это решение правильно применит цвет оттенка к выделению, как в: введите описание изображения здесь

Cœur
источник
1
Присуждается, потому что время на исходе, но желательно найти решение, которое не предполагает копания в частной иерархии :)
Джонатан.
@Джонатан. Спасибо. Вы уже получили ближайшее решение , не связанные с глядя на иерархии: потому что , как только вы setBackgroundImageдля .normal, вы должны установить все другие изображения ( в том числе других государств и setDividerImage), возможно , с некоторыми UIBezierPathи resizableImage(withCapInsets:), что делает его слишком сложным , если мы хотим , чтобы дизайн IOS 13 сюда.
Cœur
Ага, в идеале это будет исправлено в бета-версии
Джонатан.
3
В iOS 13b3 это больше не требуется. Есть теперь selectedSegmentTintColorсобственность на UISegmentedControl.
rmaddy
11

Быстрая версия ответа @Ilahi Charfeddine:

if #available(iOS 13.0, *) {
   segmentedControl.setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
   segmentedControl.selectedSegmentTintColor = UIColor.blue
} else {
   segmentedControl.tintColor = UIColor.blue
}
Виньян С
источник
10
if (@available(iOS 13.0, *)) {

    [self.segmentedControl setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor whiteColor], NSFontAttributeName: [UIFont systemFontOfSize:13]} forState:UIControlStateSelected];
    [self.segmentedControl setSelectedSegmentTintColor:[UIColor blueColor]];

} else {

[self.segmentedControl setTintColor:[UIColor blueColor]];}
Илахи Чарфеддин
источник
7

iOS13 UISegmentController

как пользоваться:

segment.setOldLayout(tintColor: .green)

extension UISegmentedControl
{
    func setOldLayout(tintColor: UIColor)
    {
        if #available(iOS 13, *)
        {
            let bg = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
             let devider = UIImage(color: tintColor, size: CGSize(width: 1, height: 32))

             //set background images
             self.setBackgroundImage(bg, for: .normal, barMetrics: .default)
             self.setBackgroundImage(devider, for: .selected, barMetrics: .default)

             //set divider color
             self.setDividerImage(devider, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)

             //set border
             self.layer.borderWidth = 1
             self.layer.borderColor = tintColor.cgColor

             //set label color
             self.setTitleTextAttributes([.foregroundColor: tintColor], for: .normal)
             self.setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
        }
        else
        {
            self.tintColor = tintColor
        }
    }
}
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()!)!
    }
}
Джигар Дарджи
источник
1
Это единственный подход, который у меня сработал - фоновые изображения. selectedSegmentTintColor по какой-то причине не работал.
DenNukem,
7

XCODE 11.1 и iOS 13

На основе ответа @Jigar Darji, но более безопасной реализации.

Сначала мы создаем сбойный инициализатор удобства:

extension UIImage {

convenience init?(color: UIColor, size: CGSize) {
    UIGraphicsBeginImageContextWithOptions(size, false, 1)
    color.set()
    guard let ctx = UIGraphicsGetCurrentContext() else { return nil }
    ctx.fill(CGRect(origin: .zero, size: size))
    guard
        let image = UIGraphicsGetImageFromCurrentImageContext(),
        let imagePNGData = image.pngData()
        else { return nil }
    UIGraphicsEndImageContext()

    self.init(data: imagePNGData)
   }
}

Затем мы расширяем UISegmentedControl:

extension UISegmentedControl {

func fallBackToPreIOS13Layout(using tintColor: UIColor) {
    if #available(iOS 13, *) {
        let backGroundImage = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
        let dividerImage = UIImage(color: tintColor, size: CGSize(width: 1, height: 32))

        setBackgroundImage(backGroundImage, for: .normal, barMetrics: .default)
        setBackgroundImage(dividerImage, for: .selected, barMetrics: .default)

        setDividerImage(dividerImage,
                        forLeftSegmentState: .normal,
                        rightSegmentState: .normal, barMetrics: .default)

        layer.borderWidth = 1
        layer.borderColor = tintColor.cgColor

        setTitleTextAttributes([.foregroundColor: tintColor], for: .normal)
        setTitleTextAttributes([.foregroundColor: UIColor.white], for: .selected)
    } else {
        self.tintColor = tintColor
    }
  }
}
ФредФлинстон
источник
Отлично! Спасибо!
Сеноцико Стелиан,
5

Вот мой вариант ответа Джонатана для Xamarin.iOS (C #), но с исправлениями для изменения размера изображения. Как и в случае с комментарием Кера к ответу Колина Блейка, я сделал все изображения, кроме разделителя, размером с сегментированный элемент управления. Разделитель равен 1x высоте сегмента.

public static UIImage ImageWithColor(UIColor color, CGSize size)
{
    var rect = new CGRect(0, 0, size.Width, size.Height);
    UIGraphics.BeginImageContext(rect.Size);
    var context = UIGraphics.GetCurrentContext();
    context.SetFillColor(color.CGColor);
    context.FillRect(rect);
    var image = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
    return image;
}

// https://stackoverflow.com/a/56465501/420175
public static void ColorSegmentiOS13(UISegmentedControl uis, UIColor tintColor, UIColor textSelectedColor, UIColor textDeselectedColor)
{
    if (!UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
    {
        return;
    }

    UIImage image(UIColor color)
    {
        return ImageWithColor(color, uis.Frame.Size);
    }

    UIImage imageDivider(UIColor color)
    {
        return ImageWithColor(color, 1, uis.Frame.Height);
    }

    // Must set the background image for normal to something (even clear) else the rest won't work
    //setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
    uis.SetBackgroundImage(image(UIColor.Clear), UIControlState.Normal, UIBarMetrics.Default);

    // setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
    uis.SetBackgroundImage(image(tintColor), UIControlState.Selected, UIBarMetrics.Default);

    // setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
    uis.SetBackgroundImage(image(tintColor.ColorWithAlpha(0.2f)), UIControlState.Highlighted, UIBarMetrics.Default);

    // setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
    uis.SetBackgroundImage(image(tintColor), UIControlState.Highlighted | UIControlState.Selected, UIBarMetrics.Default);

    // setTitleTextAttributes([.foregroundColor: tintColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
    // Change: support distinct color for selected/de-selected; keep original font
    uis.SetTitleTextAttributes(new UITextAttributes() { TextColor = textDeselectedColor }, UIControlState.Normal); //Font = UIFont.SystemFontOfSize(13, UIFontWeight.Regular)
    uis.SetTitleTextAttributes(new UITextAttributes() { TextColor = textSelectedColor, }, UIControlState.Selected); //Font = UIFont.SystemFontOfSize(13, UIFontWeight.Regular)

    // setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
    uis.SetDividerImage(imageDivider(tintColor), UIControlState.Normal, UIControlState.Normal, UIBarMetrics.Default);

    //layer.borderWidth = 1
    uis.Layer.BorderWidth = 1;

    //layer.borderColor = tintColor.cgColor
    uis.Layer.BorderColor = tintColor.CGColor;
}
t9mike
источник
3

Вы можете реализовать следующий метод

extension UISegmentedControl{
    func selectedSegmentTintColor(_ color: UIColor) {
        self.setTitleTextAttributes([.foregroundColor: color], for: .selected)
    }
    func unselectedSegmentTintColor(_ color: UIColor) {
        self.setTitleTextAttributes([.foregroundColor: color], for: .normal)
    }
}

Код использования

segmentControl.unselectedSegmentTintColor(.white)
segmentControl.selectedSegmentTintColor(.black)
Заин Анджум
источник
2

Хотя приведенные выше ответы прекрасны, большинство из них неправильно окрашивают текст внутри выделенного сегмента. Я создал UISegmentedControlподкласс, который вы можете использовать на устройствах iOS 13 и до iOS 13, и использовать свойство tintColor, как на устройствах до iOS 13.

    class LegacySegmentedControl: UISegmentedControl {
        private func stylize() {
            if #available(iOS 13.0, *) {
                selectedSegmentTintColor = tintColor
                let tintColorImage = UIImage(color: tintColor)
                setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
                setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
                setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
                setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
                setTitleTextAttributes([.foregroundColor: tintColor!, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)

                setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
                layer.borderWidth = 1
                layer.borderColor = tintColor.cgColor

// Detect underlying backgroundColor so the text color will be properly matched

                if let background = backgroundColor {
                    self.setTitleTextAttributes([.foregroundColor: background, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .selected)
                } else {
                    func detectBackgroundColor(of view: UIView?) -> UIColor? {
                        guard let view = view else {
                            return nil
                        }
                        if let color = view.backgroundColor, color != .clear {
                            return color
                        }
                        return detectBackgroundColor(of: view.superview)
                    }
                    let textColor = detectBackgroundColor(of: self) ?? .black

                    self.setTitleTextAttributes([.foregroundColor: textColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .selected)
                }
            }
        }

        override func tintColorDidChange() {
            super.tintColorDidChange()
            stylize()
        }
    }

    fileprivate extension UIImage {
        public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1, height: 1)) {
          let rect = CGRect(origin: .zero, size: size)
          UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0)
          color.setFill()
          UIRectFill(rect)
          let image = UIGraphicsGetImageFromCurrentImageContext()
          UIGraphicsEndImageContext()

          guard let cgImage = image?.cgImage else { return nil }
          self.init(cgImage: cgImage)
        }
    }

Используя tintColorDidChangeметод, мы гарантируем, что stylizeметод будет вызываться каждый раз при tintColorизменении свойства в представлении сегмента или любом из базовых представлений, что является предпочтительным поведением в iOS.

Результат: введите описание изображения здесь

Адам
источник
-2

Немного расширяя ответ Джонатана, если вам не нужны закругленные углы

extension UISegmentedControl {
    /// Tint color doesn't have any effect on iOS 13.
    func ensureiOS12Style(roundCorner: Bool = true) {
        if #available(iOS 13, *) {
            let tintColorImage = UIImage(color: tintColor)
            // Must set the background image for normal to something (even clear) else the rest won't work
            setBackgroundImage(UIImage(color: backgroundColor ?? .clear), for: .normal, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: .selected, barMetrics: .default)
            setBackgroundImage(UIImage(color: tintColor.withAlphaComponent(0.2)), for: .highlighted, barMetrics: .default)
            setBackgroundImage(tintColorImage, for: [.highlighted, .selected], barMetrics: .default)
            setTitleTextAttributes([.foregroundColor: tintColor, NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13, weight: .regular)], for: .normal)
            setDividerImage(tintColorImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)

            if !roundCorner {
                layer.masksToBounds = false

                let borderView = UIView()
                borderView.layer.borderWidth = 1
                borderView.layer.borderColor = UIColor.black.cgColor
                borderView.isUserInteractionEnabled = false
                borderView.translatesAutoresizingMaskIntoConstraints = false

                addSubview(borderView)

                NSLayoutConstraint(item: borderView, attribute: .centerX, relatedBy: .equal, toItem: self, attribute: .centerX, multiplier: 1, constant: 0).isActive = true
                NSLayoutConstraint(item: borderView, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1, constant: 0).isActive = true
                NSLayoutConstraint(item: borderView, attribute: .width, relatedBy: .equal, toItem: self, attribute: .width, multiplier: 1, constant: 0).isActive = true
                NSLayoutConstraint(item: borderView, attribute: .height, relatedBy: .equal, toItem: self, attribute: .height, multiplier: 1, constant: 0).isActive = true
            }
        }
    }
}
GoNinja
источник