Ios 在按钮周围添加CAShapeLayer

Ios 在按钮周围添加CAShapeLayer,ios,swift,Ios,Swift,我创建了一个圆形的CAShapeLayer,我想在视图中的I按钮周围添加它。我这样做,而不是一个边界,由于动画的目的。我不希望按钮周围有边框,我宁愿有一个形状。这就是我添加它的方式,但由于某些原因,它没有直接在按钮周围添加形状 这是我添加图层的代码 recordLine = CAShapeLayer() let circularPath = UIBezierPath(arcCenter: recordButton.center, radius: recordButton.frame.width

我创建了一个圆形的CAShapeLayer,我想在视图中的I按钮周围添加它。我这样做,而不是一个边界,由于动画的目的。我不希望按钮周围有边框,我宁愿有一个形状。这就是我添加它的方式,但由于某些原因,它没有直接在按钮周围添加形状

这是我添加图层的代码

recordLine = CAShapeLayer()
let circularPath = UIBezierPath(arcCenter: recordButton.center, radius: recordButton.frame.width / 2, startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true)
recordLine.path = circularPath.cgPath
recordLine.strokeColor = UIColor.white.cgColor
recordLine.fillColor = UIColor.clear.cgColor
recordLine.lineWidth = 5
view.layer.addSublayer(recordLine)

出于某种原因,这就是添加行的方式。

//尝试这样做,我希望它对您有用。 注:颜色和其他属性根据您的要求而变化

let shapeLayer = CAShapeLayer()
    shapeLayer.backgroundColor = UIColor.clear.cgColor
    shapeLayer.name = "Star"
    let path: CGPath = UIBezierPath(arcCenter: recordButton.center, radius: recordButton.frame.width / 2, startAngle: 0, endAngle: 2 * CGFloat.pi, clockwise: true)
    shapeLayer.path = path
    shapeLayer.lineWidth = 5.0
    self.layer.mask = shapeLayer

之所以会发生这种情况,是因为您在正确渲染自动布局约束之前添加了形状层

请在添加形状层之前添加一行:self.view.layoutifneed()

请检查参考图像
这对我有用。

我的按钮是编程的。我必须在
viewdilayoutsubview

lazy var cameraButton: UIButton = {
    let button = UIButton(type: .system)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.backgroundColor = UIColor.lightGray
    return button
}()

var wasCAShapeLayerAddedToCameraButton = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    if !wasCAShapeLayerAddedToCameraButton {
        wasCAShapeLayerAddedToCameraButton = true
        
        cameraButton.layer.cornerRadius = cameraButton.frame.width / 2
        
        addCAShapeLayerToCameraButton()
    }
}

func addCAShapeLayerToCameraButton() {
    
    let circularPath = UIBezierPath(arcCenter: cameraButton.center,
                                    radius: (cameraButton.frame.width / 2),
                                    startAngle: 0,
                                    endAngle: 2 * .pi,
                                    clockwise: true)
    shapeLayer.path = circularPath.cgPath
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineWidth = 10
    view.layer.addSublayer(shapeLayer)
}

现在它正在按钮下方添加,仍然不起作用。我已经修改了答案,请检查。请获取一个类属性,将其分配给nil,并将其写入检查为nil的override func viewDidLayoutSubviews()方法中,以便分配一次内存并添加它。是的,我正在调用view.LayoutFneedd()它所做的只是将其移动到按钮下方,而不是顶部。它没有在按钮周围显示。您可以为该形状设置类变量,并添加一个if检查,这样它就不会两次分配内存,也不会添加任何额外的圆。请为形状层添加成员变量,并添加check for nil,这样它就不会被添加两次。如果这对你有用的话,就把它标出来,这样它也能帮助别人
lazy var cameraButton: UIButton = {
    let button = UIButton(type: .system)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.backgroundColor = UIColor.lightGray
    return button
}()

var wasCAShapeLayerAddedToCameraButton = false

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    
    if !wasCAShapeLayerAddedToCameraButton {
        wasCAShapeLayerAddedToCameraButton = true
        
        cameraButton.layer.cornerRadius = cameraButton.frame.width / 2
        
        addCAShapeLayerToCameraButton()
    }
}

func addCAShapeLayerToCameraButton() {
    
    let circularPath = UIBezierPath(arcCenter: cameraButton.center,
                                    radius: (cameraButton.frame.width / 2),
                                    startAngle: 0,
                                    endAngle: 2 * .pi,
                                    clockwise: true)
    shapeLayer.path = circularPath.cgPath
    shapeLayer.strokeColor = UIColor.black.cgColor
    shapeLayer.fillColor = UIColor.clear.cgColor
    shapeLayer.lineWidth = 10
    view.layer.addSublayer(shapeLayer)
}