![](/img/trans.png)
[英]iOS: the background color of the header of my TableView is not changing anymore in iOS13
[英]UIControlSegment background color is not transparent anymore on iOS13
我有一個 UISegmentedControl。 它在 iOS13 之前運行良好(我將 backgroundColor 和 tintColor 都設置為 clear )。 但是現在,我沒有得到相同的結果。 我的 SegmentedControl 有一個淺灰色層。 我做了一些研究,但沒有任何效果。 (我有同樣的問題: https : //forums.developer.apple.com/thread/123955 )
以前的狀態:
當前狀態 - iOS13:
我也面臨這個問題以滿足設計要求。 在我的情況下, SegmentedControl 背景顏色應該是白色或清晰的顏色,因為視圖的背景顏色也是白色。
所以我只是在 SegmentControl 背景中添加一個白色的 UImage ,這個技巧對我有用。
if (@available(iOS 13.0, *)) {
[segmentController setBackgroundImage:[UIImage imageNamed:@"someWhiteImage"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
}
雖然它不是一個完美的解決方案,但我的要求滿足使用這個技巧。 您現在還可以在背景中添加純色背景圖像。 希望有人向我們展示正確的處理方式。
iOS 13 之前的必需設計
iOS 13 之后
所以添加白色背景圖片對我有用
.selectedSegmentTintColor
定義所選擇的按鈕的顏色和.layer.backgroundColor
顏色為整個UISegmentedControl背景。
事實證明,這不適用於背景清晰或白色,因為在 iOS 13 上,在分段控件的背景和分隔符上添加了一種背景圖像。
解決方法是使用UIGraphicsGetImageFromCurrentImageContext
從顏色創建圖像。 嘗試這個:
class ViewController: UIViewController {
@IBOutlet weak var segmentedControl: UISegmentedControl!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
segmentedControl.setiOS12Layout(tintColor: .red)
}
}
extension UISegmentedControl {
func setiOS12Layout(tintColor: UIColor) {
if #available(iOS 13, *) {
let background = UIImage(color: .clear, size: CGSize(width: 1, height: 32))
let divider = UIImage(color: tintColor, size: CGSize(width: 1, height: 32))
self.setBackgroundImage(background, for: .normal, barMetrics: .default)
self.setBackgroundImage(divider, for: .selected, barMetrics: .default)
self.setDividerImage(divider, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
self.layer.borderWidth = 1
self.layer.borderColor = tintColor.cgColor
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 context = UIGraphicsGetCurrentContext()!
context.fill(CGRect(origin: .zero, size: size))
let image = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
self.init(data: image.pngData()!)!
}
}
結果:
您可以創建一個擴展,使您的段控制清晰
segmentControl.clearBG()
這是擴展
extension UISegmentedControl {
func clearBG() {
setBackgroundImage(imageWithColor(color: UIColor.white), for: .normal, barMetrics: .default)
setBackgroundImage(imageWithColor(color: UIColor.white), for: .normal, barMetrics: .default)
setDividerImage(imageWithColor(color: .white), 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!
}
}
感謝@Maulik Pandya 的回答,我已經稍微改進了您的回答。
extension UISegmentedControl {
func clearBG() {
let clearImage = UIImage().imageWithColor(color: .clear)
setBackgroundImage(clearImage, for: .normal, barMetrics: .default)
setBackgroundImage(clearImage, for: .selected, barMetrics: .default)
setDividerImage(clearImage, forLeftSegmentState: .normal, rightSegmentState: .normal, barMetrics: .default)
}
}
public extension UIImage {
public func imageWithColor(color: UIColor) -> UIImage {
let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
UIGraphicsBeginImageContext(rect.size)
guard let context = UIGraphicsGetCurrentContext() else { return UIImage()}
context.setFillColor(color.cgColor)
context.fill(rect)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image!
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.