Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set backgroundColor of UISegmentedControl to white in iOS 13

Tags:

iOS 13 introduced some changes to the UISegmentedControl including a really nice animation when switching the selected segment. However I'm noticing that it's not displaying the backgroundColor property correctly, it always seems to have a bit of a tint to it.

I've seen questions that answer how to set the selectedSegmentTintColor and such but I'm struggling to set the backgroundColor to say .white, no matter what I do it always shows up a bit of a gray even though there's no tintColor or similar setting applied. Setting the backgroundColor to other colors shows the same behavior but its most obvious with white. Adding to the mystery is that while this difference shows up on both iOS 13 simulators and a physical device running iOS 13, the visual debugger (in XCode 11 GM2) does not show this difference!

Here's a couple screenshots showing that even though the backgroundColor of the UISegmentedControl is set to the same as the backgroundColor of the view shown behind it they are slightly different.

Device running iOS 13 (white backgroundColor) enter image description here

Same view/code shown in Visual Debugger (white backgroundColor) enter image description here

Device running iOS 13 (blue backgroundColor) enter image description here

I've tried the suggestion of applying a backgroundImage as suggested in this SO post: UISegmentedControl iOS 13 clear color but that ends up reverting the style back to how it looked in iOS 12 and you lose the nice animation as well.

Any guidance or suggestions is greatly appreciated! I've also filed a bug report with Apple, will see if anything comes of that.

like image 930
Phil Avatar asked Sep 25 '19 20:09

Phil


People also ask

How do I change the background color in Uisegmentedcontrol?

To change the overall color of the segmented control use its backgroundColor . To change the color of the selected segment use selectedSegmentTintColor . To change the color/font of the unselected segment titles, use setTitleTextAttributes with a state of . normal / UIControlStateNormal .

How do I change the Uiimage color in Objective C?

setBlendMode(. multiply) ctx. draw(image. cgImage!, in: imageRect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }


2 Answers

I have the same issue and there is no cool way to resolve it. So I did this small workaround. I dont like it and I am not proud of it, but it works.

func fixBackgroundSegmentControl( _ segmentControl: UISegmentedControl){     if #available(iOS 13.0, *) {         //just to be sure it is full loaded         DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {              for i in 0...(segmentControl.numberOfSegments-1)  {                 let backgroundSegmentView = segmentControl.subviews[i]                 //it is not enogh changing the background color. It has some kind of shadow layer                  backgroundSegmentView.isHidden = true              }         }     } } 
like image 140
Erick Silva Avatar answered Sep 20 '22 14:09

Erick Silva


I've found the simplest solution.

let segmentControl: UISegmentControl = ...  segmentControl.subviews.forEach { subview in   subview.backgroundColor = .white } 
like image 21
IvanovDeveloper Avatar answered Sep 20 '22 14:09

IvanovDeveloper