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