关于 UISegmentedControl 上的 iOS 13 更新:
这个自定义 UISegmentedControl 类使分段控件的角变圆。但它不会圆化所选控件的角(仍具有默认的角半径)。这使得它看起来很奇怪,尤其是当分段控件上有边框时:
class SegmentedControl: UISegmentedControl {
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = 20
layer.masksToBounds = true
clipsToBounds = true
}
}
以前你可以做
segmentedControl.layer.cornerRadius = 20
,它适用于所有事情,但你不能再这样做了。
有人想通了吗?
UISegmentControl 不会公开任何更改的内部子视图。您可以使用自定义分段控件,这将提供更多自定义选项。这是 Github 上搜索的第一个建议结果的示例:https://github.com/sasojadrovski/SJFluidSegmentedControl
添加扩展程序:
extension UIImage {
convenience init?(colorFill: UIColor, size: CGSize) {
let image = UIGraphicsImageRenderer(size: size).image { rendererContext in
colorFill.setFill()
UIRectFill(CGRect(origin: .zero, size: size))
}
guard let cgImage = image.cgImage else { return nil }
self.init(cgImage: cgImage)
}
}
创建 UISegmentedControl 的自定义子类:
class SegmentedControl: UISegmentedControl {
private var cornerRadius: CGFloat
init(cornerRadius: CGFloat) {
self.cornerRadius = cornerRadius
super.init(frame: .zero)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = cornerRadius
guard let selectedSegment = subviews[numberOfSegments] as? UIImageView else {
return
}
selectedSegment.layer.removeAnimation(forKey: "SelectionBounds")
selectedSegment.layer.masksToBounds = true
selectedSegment.layer.cornerRadius = cornerRadius - layer.borderWidth
selectedSegment.bounds = CGRect(origin: .zero, size: CGSize(
width: bounds.width / 2 - layer.borderWidth,
height: bounds.height - layer.borderWidth * 2
))
if let selectedSegmentTintColor = selectedSegmentTintColor {
selectedSegment.image = UIImage(
colorFill: selectedSegmentTintColor,
size: selectedSegment.bounds.size
)
}
}
创建 SegmentedControl 的实例,不要忘记设置 selectedSegmentTintColor