sushibrain
sushibrain

Reputation: 2780

Removing the shadow on a UIButton while it's being held

I have a UIButton which highlighted state involves removing the shadow. What I tried doing is putting a UILongPressGestureRecognizer onto the button:

let gesture = UILongPressGestureRecognizer(target: self, action: #selector(self.removeShadow))
gesture.numberOfTapsRequired = 1
gesture.numberOfTouchesRequired = 1
gesture.delaysTouchesBegan = false
gesture.delaysTouchesEnded = false
gesture.minimumPressDuration = 0.01
self.addGestureRecognizer(gesture)

Then in my action, I'm using the states to hide and show the shadow:

 @objc func removeShadow(gesture: UILongPressGestureRecognizer) {
    if gesture.state == .recognized {
        UIView.animate(withDuration: 0.1, animations: {
            self.layer.shadowOpacity = 0
        })
    } else if gesture.state == .ended {
        UIView.animate(withDuration: 0.1, animations: {
            self.layer.shadowOpacity = 0.15
        })
    }
}

However, this doesn't seem to trigger anything. The shadow keeps living under the button. Am I missing something here?

Thanks.

Upvotes: 1

Views: 1224

Answers (1)

glyvox
glyvox

Reputation: 58049

Your gesture recognizer is being overridden by the selector of the button. It'd be better in your scenario to override the button and hide its shadow when it's selected.

class ShadowButton: UIButton {
    override var isHighlighted: Bool {
        didSet {
            UIView.animate(withDuration: 0.1) {
                self.layer.shadowOpacity = self.isHighlighted ? 0 : 0.15
            }
        }
    }
}

Upvotes: 4

Related Questions