簡體   English   中英

UIControlSegment 背景顏色在 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM