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空间中,您可以执行以下操作:无论您希望在该视图的任何位置添加徽章。就用户体验而言,这可能“导致断开连接和混乱的界面。”