Custom UIButton .touchDragEnter and .touchDragExit area/size?

You need to overwrite the UIButton continueTracking and touchesEnded functions.

Adapting @Dean's link, the implementation would be as following (swift 4.2):

class ViewController: UIViewController {

    @IBOutlet weak var button: DragButton!

    override func viewDidLoad() {
        super.viewDidLoad()
    }

}

class DragButton: UIButton {

    private let _boundsExtension: CGFloat = 0 // Adjust this as needed

    override open func continueTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {

        let outerBounds: CGRect = bounds.insetBy(dx: CGFloat(-1 * _boundsExtension), dy: CGFloat(-1 * _boundsExtension))

        let currentLocation: CGPoint = touch.location(in: self)
        let previousLocation: CGPoint = touch.previousLocation(in: self)

        let touchOutside: Bool = !outerBounds.contains(currentLocation)
        if touchOutside {
            let previousTouchInside: Bool = outerBounds.contains(previousLocation)
            if previousTouchInside {
                print("touchDragExit")
                sendActions(for: .touchDragExit)
            } else {
                print("touchDragOutside")
                sendActions(for: .touchDragOutside)
            }
        } else {
            let previousTouchOutside: Bool = !outerBounds.contains(previousLocation)
            if previousTouchOutside {
                print("touchDragEnter")
                sendActions(for: .touchDragEnter)
            } else {
                print("touchDragInside")
                sendActions(for: .touchDragInside)
            }
        }

        return true
    }

    override open func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {

        let touch: UITouch = touches.first!
        let outerBounds: CGRect = bounds.insetBy(dx: CGFloat(-1 * _boundsExtension), dy: CGFloat(-1 * _boundsExtension))

        let currentLocation: CGPoint = touch.location(in: self)

        let touchInside: Bool = outerBounds.contains(currentLocation)
        if touchInside {
            print("touchUpInside action")
            return sendActions(for: .touchUpInside)
        } else {
            print("touchUpOutside action")
            return sendActions(for: .touchUpOutside)
        }
    }
}

Try changing the _boundsExtension value