Ios 从已定义的Bezier路径创建UIbutton?

Ios 从已定义的Bezier路径创建UIbutton?,ios,swift,uibutton,uibezierpath,Ios,Swift,Uibutton,Uibezierpath,我在一个视图控制器中定义了一系列贝塞尔路径(默认)。然而,具体来说,我想把其中一个做成一个UIButton(它还不一定要在任何地方都领先,但如果它能在触摸屏上打印一些东西就太好了) 通过研究一些类似的问题,我已经能够在模拟器上分别定义我想要的贝塞尔路径和UIButton,但还不能将它们拼接在一起 import UIKit class ViewController: UIViewController { override func viewDidLoad() { sup

我在一个视图控制器中定义了一系列贝塞尔路径(默认)。然而,具体来说,我想把其中一个做成一个UIButton(它还不一定要在任何地方都领先,但如果它能在触摸屏上打印一些东西就太好了)

通过研究一些类似的问题,我已经能够在模拟器上分别定义我想要的贝塞尔路径和UIButton,但还不能将它们拼接在一起

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

    let circlePath = UIBezierPath(arcCenter: CGPoint(x: 200, y: 350), radius: CGFloat(150), startAngle: CGFloat(0), endAngle:CGFloat(Double.pi * 2), clockwise: true)

    let shapeLayer = CAShapeLayer()
    shapeLayer.path = circlePath.cgPath

    //change the fill color
    shapeLayer.fillColor = UIColor.clear.cgColor
    //you can change the stroke color
    shapeLayer.strokeColor = UIColor.gray.cgColor
    //you can change the line width
    shapeLayer.lineWidth = 7.5

    view.layer.addSublayer(shapeLayer)

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        button.backgroundColor = .green
        button.setTitle("Test Button", for: .normal)
        button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

        self.view.addSubview(button)
    }

    @objc func buttonAction(sender: UIButton!) {
        print("Button tapped")
    }

}

如何将circlePath作为UIButton传递?

UIButton是一个UIView,因此您可以使用与视图相同的方式将创建的图层添加到按钮:

button.layer.addSublayer(shapeLayer)
请注意,该层将覆盖UIButton的标签,但解决此问题的简单方法是更改该层的z位置:

shapeLayer.zPosition = -1
例如,如果要向按钮添加圆形层:

let circlePath = UIBezierPath(ovalIn: button.bounds)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.zPosition = -1   
button.layer.addSublayer(shapeLayer)
或者,匹配示例中的圆,但在形状之前创建按钮:

// define circle parameters
let radius: CGFloat = 150
let center = CGPoint(x: 200, y: 350)

// create the button
let button = UIButton(frame: CGRect(origin: center.applying(CGAffineTransform(translationX: -radius, y: -radius)),
                                        size: CGSize(width: 2 * radius, height: 2 * radius)))

// create the circle layer
let circlePath = UIBezierPath(ovalIn: button.bounds)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.zPosition = -1

// add the circle layer to the button
button.layer.addSublayer(shapeLayer)

view.addSubview(button)

谢谢你的回答。我必须切换按钮的位置和路径才能让它运行。然而,每当我点击原始按钮的位置时,我只会收到“按钮按下”的消息,而不是圆形层。我正试图使圆形层成为视图上唯一的按钮-如果我不清楚,很抱歉!是的,按钮的框架和图层的框架可能不同。UIBezierPath(ovalIn:button.bounds)创建一个路径,当指定给按钮时,该路径位于按钮内部。为什么要先声明路径,然后声明按钮,而不是相反,你有什么特别的原因吗?因为我知道的不多。我更关注路径(可能是不必要的),因为我只希望路径的笔划对触摸做出反应,而不是整个圆圈。我还希望设置,以便以后可以将动画渐变应用到路径的笔划上,所以您想要一条对触摸做出响应的路径吗?UIButton确实不适合这样做,这可能就是导致混淆的原因。你应该寻找“如何检测CGPath上的接触”的问题,或者自己创建一个。正是这样——我不喜欢含糊其辞。我就这么做。谢谢Priebe