ytpm
ytpm

Reputation: 5160

Change UIButton rect without drawRect

I have a UIButton on xib which is a rectangle, I want to change it's frame to have an arrow like corner, but keep it on the xib (from interface builder), how can I do that?

I know that I can do that with UIBezierPath in drawRect, but that is only to create a custom shape and add it from code.

Is there another way?

enter image description here This is my code with custom button class:

class ButtonContinue: UIButton {

    var path: UIBezierPath!

    override func awakeFromNib() {
        backgroundColor = UIColor.green
        addTarget(self, action: #selector(touchDown), for: .touchDown)
    }

    override func draw(_ rect: CGRect) {

        path = UIBezierPath()
        path.move(to: CGPoint(x: 32, y: 28 + (rect.size.height / 2)))
        path.addLine(to: CGPoint(x: 70, y: 28))
        path.addLine(to: CGPoint(x: rect.size.width, y: 28))
        path.addLine(to: CGPoint(x: rect.size.width, y: rect.size.height + 28))
        path.addLine(to: CGPoint(x: 70, y: rect.size.height + 28))
        path.close()

        let shapeLayer = CAShapeLayer()
        shapeLayer.strokeColor = UIColor.red.cgColor
        shapeLayer.fillColor = UIColor.blue.cgColor
        shapeLayer.path = path.cgPath
        layer.addSublayer(shapeLayer)
    }

    func touchDown(button: ButtonContinue, event: UIEvent) {
        if let touch = event.touches(for: button)?.first {
            let location = touch.location(in: button)

            if path.contains(location) == false {
                button.cancelTracking(with: nil)
            }
        }
    }
}

Upvotes: 0

Views: 308

Answers (1)

Utemissov
Utemissov

Reputation: 116

Just put the image you provided in assets of the project. And set buttons image to the image in assets.

self.imageView.image = UIImage(named: "imageName")

And if you would like to change color of the lines of the image you can set the image rendering to alwaysTemplate

self.imageView?.image = UIImage(named: "imageName")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
self.imageView?.tintColor = .red

Upvotes: 0

Related Questions