복붙노트

[SWIFT] 스위프트 2 버튼 사용자 정의 모양의 프레임을 만들려면

SWIFT

스위프트 2 버튼 사용자 정의 모양의 프레임을 만들려면

해결법


  1. 1.여기에만 특정 지역의 터치에 반응하는 버튼의 일례이다.

    여기에만 특정 지역의 터치에 반응하는 버튼의 일례이다.

    class MyButton: UIButton {
    
        var path: UIBezierPath!
    
        override func awakeFromNib() {
            backgroundColor = UIColor.greenColor()
            addTarget(self, action: #selector(touchDown), forControlEvents: .TouchDown)
        }
        override func drawRect(rect: CGRect) {
            path = UIBezierPath()
    
            path.moveToPoint(CGPointMake(150, 10))
            path.addLineToPoint(CGPointMake(200, 10))
            path.addLineToPoint(CGPointMake(150, 100))
            path.addLineToPoint(CGPointMake(100, 100))
            path.closePath()
    
            let shapeLayer = CAShapeLayer()
            shapeLayer.strokeColor = UIColor.redColor().CGColor
            shapeLayer.fillColor = UIColor.blueColor().CGColor
            shapeLayer.path = path.CGPath
            layer.addSublayer(shapeLayer)
    
        }
    
        func touchDown(button: MyButton, event: UIEvent) {
            if let touch = event.touchesForView(button)?.first {
                let location = touch.locationInView(button)
    
                if path.containsPoint(location) == false {
                    button.cancelTrackingWithEvent(nil)
                }
            }
    
        }
    }
    

  2. 2.당신은 스위프트 3/4에서 그것을하고 싶은 경우 :

    당신은 스위프트 3/4에서 그것을하고 싶은 경우 :

    class MyButton: 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: 150, y: 10))
            path.addLine(to: CGPoint(x: 200, y: 10))
            path.addLine(to: CGPoint(x: 150, y: 100))
            path.addLine(to: CGPoint(x: 100, y: 100))
            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: MyButton, 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)
                }
            }
        }
    }
    
  3. from https://stackoverflow.com/questions/36877085/how-to-make-the-frame-of-a-button-custom-shape-in-swift-2 by cc-by-sa and MIT license