1

everyone knows that when you drag outside a button it don't cancel the highlight state right away by UIButton's default. UIControlEventTouchDragExit triggers when 70 pixels away. I want that distance to be 0. So after searching the solution of it, I tried to create a subclass like this:

import UIKit

class UINewButton: UIButton {
    override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
        print("here")
        let touchOutside = !CGRectContainsPoint(self.bounds, touch.locationInView(self))
        if touchOutside {
            let previousTochInside = CGRectContainsPoint(self.bounds, touch.previousLocationInView(self))
            if previousTochInside {
                print("Sending UIControlEventTouchDragExit")
                self.sendActionsForControlEvents(.TouchDragExit)
                self.highlighted = false
                self.selected = false
            }else{
                print("Sending UIControlEventTouchDragOutside")
                self.sendActionsForControlEvents(.TouchDragOutside)
            }
        }else{
            let previousTouchOutside = !CGRectContainsPoint(self.bounds, touch.previousLocationInView(self))
            if previousTouchOutside{
                print("Sending UIControlEventTouchDragEnter")
                self.sendActionsForControlEvents(.TouchDragEnter)
            }else{
                print("Sending UIControlEventTouchDragInside")
                self.sendActionsForControlEvents(.TouchUpInside)
            }
        }
        return super.continueTrackingWithTouch(touch, withEvent: event)
    }
}

and create a button like this in a UIViewController

@IBOutlet var confirmButton: UINewButton!

I assumed when a UIButton being touched and dragged. It would call the function in this sequence:

beginTrackingWithTouch(when touched) -> continueTrackingWithTouch(when dragged) -> endTrackingWithTouch(when left)

But here is the weird part. Even though I override the function continueTrackingWithTouch, it still not been called. Cause the console window didn't show "here" where I put there in it. And the result remain the default distance 70. how come is that?

I tried to call the three functions mentioned above and return true if it needs one. What did I missed?

After reading this article: UIControlEventTouchDragExit triggers when 100 pixels away from UIButton Still not helping :( (plus it written in objective-C...)

Isn't the distance of 70px a property of the function so I can just changed?(How can I see the original function by the way? There is no detail in Apple Developer Documentation...) Should I use button.addtarget in the UIViewController? But it seems like another way to do it.

Here is another question: If I want to cancel the highlight state when dragged outside the button, is this right?

self.highlighted = false
self.selected = false

I don't know which one is the right one so I used it all.

please help! Just a newbie in swift but I have been stuck in this problem for 3 days. QQ

Community
  • 1
  • 1
andrew54068
  • 1,326
  • 14
  • 29

1 Answers1

0

In Swift 3 the function signature has changed. It's now:

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

API Reference

Mike Sand
  • 2,750
  • 14
  • 23