Come cambiare i colori di un segmento in un UISegmentedControl in iOS 13?


109

A UISegmentedControlha un nuovo aspetto in iOS 13 e il codice esistente per modificare i colori del controllo segmentato non funziona più come hanno fatto.

Prima di iOS 13 era possibile impostare il tintColore che sarebbe stato utilizzato per il bordo attorno al controllo segmentato, le linee tra i segmenti e il colore di sfondo del segmento selezionato. Quindi puoi cambiare il colore dei titoli di ogni segmento usando l'attributo del colore di primo piano con titleTextAttributes.

Sotto iOS 13, tintColornon fa nulla. È possibile impostare i controlli segmentati backgroundColorper modificare il colore complessivo del controllo segmentato. Ma non riesco a trovare alcun modo per modificare il colore utilizzato come sfondo del segmento selezionato. L'impostazione degli attributi di testo funziona ancora. Ho anche provato a impostare il colore di sfondo del titolo, ma questo influisce solo sullo sfondo del titolo, non sul resto del colore di sfondo del segmento selezionato.

In breve, come si modifica il colore di sfondo del segmento attualmente selezionato di a UISegmentedControlin iOS 13? Esiste una soluzione adeguata, utilizzando API pubbliche, che non richieda di scavare nella struttura delle sottoview private?

Non ci sono nuove proprietà in iOS 13 per UISegmentedControlo UIControle nessuna delle modifiche UIViewè rilevante.

Risposte:


134

Come di iOS 13b3, v'è ora una selectedSegmentTintColorsu UISegmentedControl.

Per modificare il colore complessivo del controllo segmentato, utilizzare il suo backgroundColor.

Per cambiare il colore del segmento selezionato utilizzare selectedSegmentTintColor.

Per modificare il colore / carattere dei titoli dei segmenti non selezionati, utilizzare setTitleTextAttributescon uno stato di .normal/ UIControlStateNormal.

Per modificare il colore / carattere dei titoli dei segmenti selezionati, utilizzare setTitleTextAttributescon lo stato .selected/ UIControlStateSelected.

Se crei un controllo segmentato con immagini, se le immagini vengono create come immagini modello, tintColorverranno utilizzati i controlli segmentati per colorare le immagini. Ma questo ha un problema. Se imposti lo tintColorstesso colore, selectedSegmentTintColorl'immagine non sarà visibile nel segmento selezionato. Se imposti lo tintColorstesso colore di backgroundColor, le immagini sui segmenti non selezionati non saranno visibili. Ciò significa che il controllo segmentato con le immagini deve utilizzare 3 colori diversi affinché tutto sia visibile. Oppure puoi utilizzare immagini non modello e non impostare l'estensione tintColor.

In iOS 12 o versioni precedenti, imposta semplicemente i controlli segmentati tintColoro fai affidamento sul colore della tinta generale dell'app.


Come si imposta il controller di segmento senza bordi? Non vedo alcuna impostazione per questo in iOS 13. In precedenza, l'impostazione di tintcolor era sufficiente per ottenere un controllo del segmento senza bordi.
Deepak Sharma

Aggiungi il colore del bordo ecc. In modo che tutti possano trovare tutti i problemi relativi al colore del segmento qui. cosa si dice? :)
Yogesh Patel

1
@YogeshPatel E il colore del bordo? Non c'è il colore del bordo in iOS 13 e in iOS 12 è impostato con il tintColorquale è già coperto nella risposta.
rmaddy

@rmaddy Ho impostato questo [segmentedControl.layer setBorderColor: [[UIColor whiteColor] CGColor]]; [segmentedControl.layer setBorderWidth: 0,5]; mi dà il bordo e il colore del bordo in iOS 13.
Yogesh Patel

1
Oh, quel confine. Ciò si applica a qualsiasi vista, non solo a un controllo segmentato. Questo va oltre lo scopo della domanda originale e di questa risposta. Il tuo commento è sufficiente.
rmaddy

47

A partire da Xcode 11 beta 3

Ora c'è la selectedSegmentTintColorproprietà UISegmentedControl.

Vedi la risposta di rmaddy


Per ripristinare l'aspetto di iOS 12

Non sono riuscito a colorare il colore del segmento selezionato, spero che verrà risolto in una prossima beta.

L'impostazione dell'immagine di sfondo dello stato selezionato non funziona senza impostare l'immagine di sfondo dello stato normale (che rimuove tutto lo stile di iOS 13)

Ma sono stato in grado di riportarlo all'aspetto di iOS 12 (o abbastanza vicino, non sono stato in grado di riportare il raggio dell'angolo alla sua dimensione più piccola).

Non è l'ideale, ma un controllo segmentato bianco brillante sembra un po 'fuori posto nella nostra app.

(Non sapevo che UIImage(color:)fosse un metodo di estensione nella nostra base di codice. Ma il codice per implementarlo è in giro per il web)

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

Immagine che mostra l'effetto del codice sopra


Questa potrebbe essere una buona soluzione alternativa. Non ho ancora avuto la possibilità di provarlo, ma è necessaria anche una chiamata a setTitleTextAttributesper rendere il titolo del segmento selezionato di colore bianco?
rmaddy

Hmm, sembra che dovrebbe ma apparentemente no. Non ho accesso a quell'atmosfera di utilizzo del codice, ma l'immagine a sinistra viene creata con quel codice.
Jonathan.

8
stackoverflow.com/a/33675160/5790492 per UIImage (colore :) estensione.
Nik Kov

1
Sarebbe bello se aggiungessi l'estensione UIImage, in questo modo, la tua risposta non è completa iho
FredFlinstone

1
@VityaShurapov la sua impostazione per quando è sia evidenziato che selezionato, non è un array di stati passati ma piuttosto un set di opzioni, il che significa che i valori vengono combinati per creare un nuovo stato.
Jonathan.

36

IOS 13 e Swift 5.0 (Xcode 11.0) Segment Control 100% funzionante

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

 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
}

7
hai provato ad impostare lo sfondo come bianco? per me sta diventando grigiastro
Ronit il

@ItanHant quale xcode e swift language stai usando?
Maulik Patel

@Ronit ofcourse !! Proverò, ma per favore dimmi quale tipo di output viene visualizzato ora
Maulik Patel

swift 5, xcode 11.3! mostra quello che vuole! non quello che voglio :)
Itan Hant

15

Ho provato la soluzione alternativa e funziona benissimo per me. Ecco la versione 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
Non sono sicuro che funzionerà con CGRectMake(0.0f, 0.0f, 1.0f, 1.0f): dai miei test con Xcode 11 beta, rectdoveva avere la stessa dimensione dei limiti del controllo segmentato.
Cœur

2
Poiché iOS13 beta 6 il tintcolor non veniva visualizzato su un pulsante selezionato, quindi ho dovuto aggiungere una riga: [self setTitleTextAttributes: @ {NSForegroundColorAttributeName: UIColor.blackColor, NSFontAttributeName: [UIFont systemFontOfSize: 13]} forState: UIControl];
Peter Johnson,

Quando provo a usarlo su [[UISegmentedControl appearance] ensureiOS12Style]ottengo un'eccezione. Qualche idea su cosa sta succedendo? Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSMethodSignature getArgumentTypeAtIndex:]: index (2) out of bounds [0, 1]'
Jeremy Hicks,

13

A partire da Xcode 11 beta 3

Ora c'è la selectedSegmentTintColorproprietà UISegmentedControl.

Grazie @rmaddy!


Risposta originale, per Xcode 11 beta e beta 2

Esiste una soluzione adeguata, utilizzando API pubbliche, che non richieda di scavare nella struttura delle sottoview private?

Con Xcode 11.0 beta, sembra essere una sfida farlo secondo le regole, perché fondamentalmente richiede di ridisegnare tutte le immagini di sfondo per ogni stato da solo, con angoli arrotondati, trasparenza e resizableImage(withCapInsets:). Ad esempio, dovresti generare un'immagine colorata simile a:
inserisci qui la descrizione dell'immagine

Quindi, per ora, il modo in cui scaviamo nelle sottovisioni sembra molto più semplice:

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

Questa soluzione applicherà correttamente il colore della tinta alla selezione, come in: inserisci qui la descrizione dell'immagine


1
Premiato perché il tempo sta per scadere, ma preferibilmente verrà trovata una soluzione che non implichi scavare nella gerarchia privata :)
Jonathan.

@Jonathan. Grazie. È già ottenuto la soluzione più vicina non prevedono guardando la gerarchia: perché una volta che setBackgroundImageper .normal, è necessario impostare tutte le altre immagini (tra cui altri stati e setDividerImage), probabilmente con un po ' UIBezierPathe resizableImage(withCapInsets:), il che lo rende eccessivamente complessa se vogliamo che il progetto iOS 13 per di qua.
Cœur

Sì, idealmente verrà risolto in una beta
Jonathan.

3
Non è più necessario a partire da iOS 13b3. Ora c'è la selectedSegmentTintColorproprietà UISegmentedControl.
rmaddy

11

Versione rapida della risposta di @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

come usare:

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
Questo è l'unico approccio che ha funzionato per me: le immagini di sfondo. selectedSegmentTintColor non ha funzionato per qualche motivo.
DenNukem

7

XCODE 11.1 e iOS 13

Basato sulla risposta di @Jigar Darji ma un'implementazione più sicura.

Per prima cosa creiamo un inizializzatore di convenienza fallibile:

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

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

Perfetto! Grazie!
Senocico Stelian il

5

Ecco la mia opinione sulla risposta di Jonathan. Per Xamarin.iOS (C #), ma con correzioni per il dimensionamento delle immagini. Come per il commento di Cœur sulla risposta di Colin Blake, ho creato tutte le immagini tranne il divisore della dimensione del controllo segmentato. Il divisore è 1 x altezza del segmento.

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

3

È possibile implementare il seguente metodo

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

Codice di utilizzo

segmentControl.unselectedSegmentTintColor(.white)
segmentControl.selectedSegmentTintColor(.black)

0

Sebbene le risposte precedenti siano ottime, la maggior parte di esse ha sbagliato il colore del testo all'interno del segmento selezionato. Ho creato una UISegmentedControlsottoclasse che puoi utilizzare su dispositivi iOS 13 e pre-iOS 13 e utilizzare la proprietà tintColor come faresti su dispositivi pre 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)
        }
    }

Usando il tintColorDidChangemetodo ci assicuriamo che il stylizemetodo venga chiamato ogni volta che la tintColorproprietà cambia nella vista del segmento o in una qualsiasi delle viste sottostanti, che è un comportamento preferito su iOS.

Risultato: inserisci qui la descrizione dell'immagine


-2

Espandendo un po 'la risposta di Jonathan nel caso in cui non desideri arrotondare gli angoli

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
            }
        }
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.