iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的角半径?

问题描述 投票:0回答:2

关于 UISegmentedControl 上的 iOS 13 更新:

这个自定义 UISegmentedControl 类使分段控件的角变圆。但它不会圆化所选控件的角(仍具有默认的角半径)。这使得它看起来很奇怪,尤其是当分段控件上有边框时:

class SegmentedControl: UISegmentedControl {
      override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = 20
        layer.masksToBounds = true
        clipsToBounds = true
     }
}

以前你可以做

segmentedControl.layer.cornerRadius = 20
,它适用于所有事情,但你不能再这样做了。

有人想通了吗?

ios swift uisegmentedcontrol ios13
2个回答
1
投票

UISegmentControl 不会公开任何更改的内部子视图。您可以使用自定义分段控件,这将提供更多自定义选项。这是 Github 上搜索的第一个建议结果的示例:https://github.com/sasojadrovski/SJFluidSegmentedControl


0
投票

添加扩展程序:

    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

Screenshot

© www.soinside.com 2019 - 2024. All rights reserved.