Как сделать так, чтобы CAshapeLayer помещался в кнопку? - PullRequest
0 голосов
/ 02 апреля 2020

Я попытался создать функцию внутри пользовательского класса UIButton, чтобы добавить фигуру к существующей кнопке.

func drawStartButton(){
    let shape = CAShapeLayer()
    let path = UIBezierPath()
    path.move(to: CGPoint(x: 0, y: 0))
    path.addLine(to: CGPoint(x: 500, y: 0))
    path.addLine(to: CGPoint(x: 500, y: -100))
    path.addLine(to: CGPoint(x: 250, y: -50))
    path.addLine(to: CGPoint(x: 0, y: -100))
    path.addLine(to: CGPoint(x: 0, y: 0))
    path.close()

    shape.path = path.cgPath
    shape.fillColor = redColor.cgColor
    shape.frame = self.bounds
    self.layer.addSublayer(shape)

}

Пока проблем нет ... НО, когда я добавляю слой к кнопке, слой, конечно, слишком большой! Как я могу "автоматически изменить размер" слоя к его кнопке? Я ожидал что-то вроде

shape.frame = self.bounds ... но путь по-прежнему остается того же размера, что и без self.bounds.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020
class CustomShapeCAshapeLayer: CAShapeLayer {

    func shapeButton(width: CGFloat, height: CGFloat){
        let path = UIBezierPath()
        path.move(to: CGPoint(x: 0, y: 0))
        path.addLine(to: CGPoint(x: width, y: 0))
        path.addLine(to: CGPoint(x: width, y: height + 30))
        path.addLine(to: CGPoint(x: width/2, y: height))
        path.addLine(to: CGPoint(x: 0, y: height + 30))
        path.addLine(to: CGPoint(x: 0, y: 0))
        path.close()

        self.fillColor = redColor.cgColor
        self.path = path.cgPath
    }
}

основной:

let layer = CustomShapeCAshapeLayer()
layer.shapeButton(width: startGameButton.frame.width, height: startGameButton.frame.height)
startGameButton.layer.addSublayer(layer)
0 голосов
/ 02 апреля 2020

Лучше всего сделать подкласс для кнопки, а затем расположить слой в layoutSubviews, который вызывается при изменении окружающего кадра.

final class StartButton: UIButton {

    private let shapeLayer = CAShapeLayer()

    override func layoutSubviews() {
        super.layoutSubviews()
        shapeLayer.frame = bounds
    }
}

Но я замечаю, что вы диктуете гигантскую форму с точки зрения ваших CGPoint с. Возможно, вам придется разделить слой на подклассы и перерисовать на основе ваших границ в layoutSublayers.

...