段控制的SelectedTintColor在iOS 13上不是圆角

时间:2019-10-10 04:33:50

标签: ios swift4 uisegmentedcontrol ios13

圆角在iOS 12及以下版本上运行良好,但在iOS 13上已损坏。我创建了一个自定义的Segment控件类。

代码:

class SegmentedControl: UISegmentedControl {
    override func layoutSubviews() {
      super.layoutSubviews()
      layer.cornerRadius = self.bounds.size.height / 2.0
      layer.borderColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1.0).cgColor
      layer.borderWidth = 1.0
      layer.masksToBounds = true
      clipsToBounds = true

   }
}

我已经看过这篇文章-How to change the colors of a segment in a UISegmentedControl in iOS 13? 但我没有任何解决办法。

截屏: enter image description here

5 个答案:

答案 0 :(得分:3)

我在iOS 13上遇到了同样的问题。然后,我深入研究了它的视图层次结构,然后发现它具有多个子视图。因此,我为iOS 13制作了一个技巧。您必须对iOS 13进行以下更改-

  1. selectedSegmentTintColor更改为Clear-self.selectedSegmentTintColor = .clear
  2. layoutSubviews内添加以下代码段-

    for i in 0...subviews.count - 1{
    
            if let subview = subviews[i] as? UIImageView{
    
                if i == self.selectedSegmentIndex {
    
                    subview.backgroundColor = UIColor(red: 170.0/255.0, green: 170.0/255.0, blue: 170.0/255.0, alpha: 1.0)
    
                }else{
    
                    subview.backgroundColor = .clear
                }
    
            }
        }
    

希望它能对您有所帮助。

答案 1 :(得分:2)

快捷键5

如果您使用子类:

Future<String> getMenu() async{
  print("before simulateLongJobOrRootBundle");
  var jsonString = await simulateLongJobOrRootBundle();
  print(jsonString);
  print("after jsonString");
  return 'Your jsonString is: $jsonString';
}

Future<String> simulateLongJobOrRootBundle() async{
  print("In simulateLongJobOrRootBundle");
  // Imagine that this function is more complex and slow
  return Future.delayed(Duration(seconds: 4), () => 'Large Latte');
}


void main() {
  print('main');
  print(getMenu());
}

如果使用默认的分段控件,只需在分段控件的名称前加上前缀:

override func layoutSubviews() {
    super.layoutSubviews()
    roundCorners(radius: frame.height / 2)

    if #available(iOS 13.0, *) {
        selectedSegmentTintColor = .clear
    } else {
        tintColor = .clear
    }

    for (index, subview) in subviews.enumerated() {
        if ((subviews[index] as? UIImageView) != nil) && index == selectedSegmentIndex {
            subview.backgroundColor = .white
            subview.roundCorners(radius: subview.frame.height / 2)
        } else {
            subview.backgroundColor = .clear
        }
    }
}

private func roundCorners(radius: CGFloat) {
    layer.roundCorners(radius: radius)
    self.clipsToBounds = true
}

答案 2 :(得分:0)

此代码对我有用 iOS 13-Swift 5.1

    segment.layer.cornerRadius = 12
    segment.layer.borderWidth = 1
    segment.layer.borderColor = UIColor.black.cgColor
    segment.font(name: "TheSans-Plain", size: 14)
    segment.clipsToBounds = true
    segment.layer.masksToBounds = true

    if #available(iOS 13.0, *) {
        segment.selectedSegmentTintColor = .red
    } 

答案 3 :(得分:0)

为细分创建自定义类

class CustomSegmentedControl: UISegmentedControl {
override func layoutSubviews() {
    super.layoutSubviews()
    layer.cornerRadius = self.bounds.size.height / 2.0
    layer.borderColor = use_your_custom_color
    layer.borderWidth = 1.0
    layer.masksToBounds = true
    clipsToBounds = true
    for i in 0...subviews.count - 1{
        if let subview = subviews[i] as? UIImageView{
            if i == self.selectedSegmentIndex {
                subview.backgroundColor = use_your_custom_color
            }else{
                subview.backgroundColor = .white
            }
        }
    }
}}

也许这样会易于使用

   @IBOutlet weak var reminderSegmentControl: CustomSegmentedControl!

答案 4 :(得分:0)

与其他解决方案类似,我具有“关注子类别”细分控制 <div class="progress"> <div class="progress-bar"></div> <span>Level 5</span> </div>

哪个给出以下结果-

enter image description here

UISegmentedControl

语言:class OYSegmentControl: UISegmentedControl { override func layoutSubviews(){ super.layoutSubviews() let segmentStringSelected: [NSAttributedString.Key : Any] = [ NSAttributedString.Key.font : UIFont.fontActionLabel(ofSize: 14.0), NSAttributedString.Key.foregroundColor : UIColor.white ] let segmentStringHighlited: [NSAttributedString.Key : Any] = [ NSAttributedString.Key.font : UIFont.fontActionLabel(ofSize: 14.0), NSAttributedString.Key.foregroundColor : #colorLiteral(red: 0.5567105412, green: 0.5807551742, blue: 0.6022000909, alpha: 1) ] setTitleTextAttributes(segmentStringHighlited, for: .normal) setTitleTextAttributes(segmentStringSelected, for: .selected) setTitleTextAttributes(segmentStringHighlited, for: .highlighted) layer.masksToBounds = true if #available(iOS 13.0, *) { selectedSegmentTintColor = #colorLiteral(red: 0, green: 0.861200273, blue: 0.67304039, alpha: 1) } else { tintColor = #colorLiteral(red: 0, green: 0.861200273, blue: 0.67304039, alpha: 1) } backgroundColor = #colorLiteral(red: 0.9191747308, green: 0.9334954619, blue: 0.9506797194, alpha: 1) //corner radius let cornerRadius = bounds.height / 2 let maskedCorners: CACornerMask = [.layerMinXMinYCorner, .layerMinXMaxYCorner, .layerMaxXMinYCorner, .layerMaxXMaxYCorner] //background clipsToBounds = true layer.cornerRadius = cornerRadius layer.maskedCorners = maskedCorners let foregroundIndex = numberOfSegments if subviews.indices.contains(foregroundIndex), let foregroundImageView = subviews[foregroundIndex] as? UIImageView { foregroundImageView.image = UIImage() foregroundImageView.clipsToBounds = true foregroundImageView.layer.masksToBounds = true foregroundImageView.backgroundColor = #colorLiteral(red: 0, green: 0.861200273, blue: 0.67304039, alpha: 1) foregroundImageView.layer.cornerRadius = bounds.height / 2 + 5 foregroundImageView.layer.maskedCorners = maskedCorners } } override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { return false } }

注意:仅当您从情节提要中设置了插座/框架时,此方法才有效。 代码框架将导致问题。 cornerRadius上的额外5 px,可以使其更好地环绕矩形。 我最终使用了-https://github.com/alokc83/MASegmentedControl,因为我的用例来自“仅代码”视图。