Ios 在用作导航项的UISegmentedControl上模拟徽章

Ios 在用作导航项的UISegmentedControl上模拟徽章,ios,swift,uinavigationcontroller,uisegmentedcontrol,badge,Ios,Swift,Uinavigationcontroller,Uisegmentedcontrol,Badge,我有一个UIViewController,它嵌入在UINavigationController中。此视图控制器的导航项是一个带有3个段的UISegmentedControl。我正试图找到一种方法,在每个片段中添加一个“新”徽章。似乎UISegmentedControl通常不允许您执行此操作,但我认为出于我的目的,也许我可以使用位于每个段左边缘或右边缘的自定义UIView来模拟此操作。我知道我可以得到UISegmentedControl的宽度,并且由于自动大小模式设置为“等宽度”,因此我可以简单地

我有一个
UIViewController
,它嵌入在
UINavigationController
中。此视图控制器的导航项是一个带有3个段的
UISegmentedControl
。我正试图找到一种方法,在每个片段中添加一个“新”徽章。似乎
UISegmentedControl
通常不允许您执行此操作,但我认为出于我的目的,也许我可以使用位于每个段左边缘或右边缘的自定义
UIView
来模拟此操作。我知道我可以得到
UISegmentedControl
的宽度,并且由于自动大小模式设置为“等宽度”,因此我可以简单地将总宽度除以3来确定每个段的近似宽度,这似乎是合理的

但是,有几件事我不确定:

  • 是否可以在导航栏中确定
    UISegmentedControl
    的x/y位置,以便我知道自定义视图的位置
  • 然后是否可以在导航栏包含的空间内的这些位置添加自定义视图

  • 在管段控制柄上方添加视图,放置约束。

    ViewDidLoad()中使用代码

     self.badge1.addSubview(self.addCounter(count: 0))
     self.badge2.addSubview(self.addCounter(count: 9))
    
    使用此功能可设置徽章计数器

    func addCounter(count: Int)->UIView {
        // Count > 0, show count
        if count > 0 {
    
            // Create label
            let fontSize: CGFloat = 10
            let label = UILabel()
            label.font = UIFont.systemFont(ofSize: fontSize)
            label.textAlignment = .center
            label.textColor = .white
            label.backgroundColor = .red
    
            // Add count to label and size to fit
            label.text = "\(NSNumber(value: count))"
            label.sizeToFit()
    
            // Adjust frame to be square for single digits or elliptical for numbers > 9
            var frame: CGRect = label.frame
            frame.size.height += CGFloat(Int(0.4 * fontSize))
            frame.size.width = (count <= 9) ? frame.size.height : frame.size.width + CGFloat(Int(fontSize))
            label.frame = frame
    
            // Set radius and clip to bounds
            label.layer.cornerRadius = frame.size.height / 2.0
            label.clipsToBounds = true
    
            // Show label in accessory view and remove disclosure
            return label
    
        } else {
            return UIView()
        }
    }
    
    func addCounter(计数:Int)->UIView{
    //计数>0,显示计数
    如果计数>0{
    //创建标签
    让fontSize:CGFloat=10
    let label=UILabel()
    label.font=UIFont.systemFont(ofSize:fontSize)
    label.textAlignment=.center
    label.textColor=.white
    label.backgroundColor=.red
    //将计数添加到标签中,并根据需要调整大小
    label.text=“\(NSNumber(值:计数))”
    label.sizeToFit()
    //对于单个数字,将框架调整为方形;对于大于9的数字,将框架调整为椭圆形
    变量frame:CGRect=label.frame
    frame.size.height+=CGFloat(整数(0.4*fontSize))
    
    frame.size.width=(算了,我猜应该是围绕UISegmentedControl创建一个包装视图,并从视图中规则所有逻辑。它基本上可以是一个UIView,其中添加了分段控件作为子视图。现在,通过使用简单的计算,您将很容易找到分段的位置,而且,由于它位于您自己的UIView空间中,您可以执行以下操作:无论您希望在该视图的任何位置添加徽章。就用户体验而言,这可能“导致断开连接和混乱的界面。”