【问题标题】:UIControlSegment background color is not transparent anymore on iOS13UIControl Segment 背景颜色在 iOS 13 上不再透明
【发布时间】:2019-12-06 11:59:28
【问题描述】:

我有一个 UISegmentedControl。 它在 iOS13 之前工作正常(我将 backgroundColor 和 tintColor 都设置为清除)。 但是现在,我没有得到相同的结果。 我的 SegmentedControl 有一个浅灰色层。 我做了一些研究,但没有任何效果。 (我也有同样的问题:https://forums.developer.apple.com/thread/123955

之前的状态:

当前状态 - iOS13:

【问题讨论】:

  • 你能分享你在 UIControlSegment 上定义颜色的代码吗?
  • 可以发一下你想要实现的UI图片吗?
  • @MaulikPandya:我已经更新了帖子
  • @MarinaAguilar UIColor.clear

标签: ios swift uisegmentedcontrol uicolor ios13.2


【解决方案1】:

我也面临这个问题以满足设计要求。在我的情况下,SegmentedControl 背景颜色应该是白色或清晰的颜色,因为视图的背景颜色也是白色的。

所以我只是在 SegmentControl 背景中添加了一个白色的 UImage,这个技巧对我有用。

if (@available(iOS 13.0, *)) {
   [segmentController setBackgroundImage:[UIImage imageNamed:@"someWhiteImage"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
}

虽然这不是一个完美的解决方案,但我的要求可以满足使用这个技巧。您现在也可以在背景中添加纯色背景图像。希望有人向我们展示正确的处理方式。

iOS 13 之前的必需设计

iOS 13 之后

所以添加白色背景图片对我有用

【讨论】:

    【解决方案2】:

    .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()!)!
        }
    }
    

    结果:

    【讨论】:

      【解决方案3】:

      你可以创建一个扩展来让你的段控制清晰

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

      【讨论】:

        【解决方案4】:

        感谢@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!
          }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-05
          • 2012-06-26
          • 2013-02-05
          • 2021-10-26
          • 1970-01-01
          • 2015-02-10
          相关资源
          最近更新 更多