spencer.sm
spencer.sm

Reputation: 20614

Add padding to a UIButton that has no text

I have a UIButton that is 36x36 and I want to add padding (in essence like CSS) so that the touchable area is the recommended 44x44.

I've tried adding edge inserts through the Interface Builder and also with the code below but nothing I've tried increases the touchable area.

resetButton.contentEdgeInsets.top = 50
resetButton.contentEdgeInsets.left = 50

Does an edge inset only work with buttons that include text?

Update:

Upvotes: 0

Views: 548

Answers (1)

schmidt9
schmidt9

Reputation: 4538

I overwrote in Swift this answer and it works:

import UIKit
import ObjectiveC

private var KEY_HIT_TEST_EDGE_INSETS: String = "HitTestEdgeInsets"

extension UIButton {

    public func setHitTestEdgeInsets(inout hitTestEdgeInsets: UIEdgeInsets) {
        let value = NSValue(&hitTestEdgeInsets, withObjCType:NSValue(UIEdgeInsets: UIEdgeInsetsZero).objCType)
        objc_setAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS, value, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }

    private func hitTestEdgeInsets() -> UIEdgeInsets {
        let value = objc_getAssociatedObject(self, &KEY_HIT_TEST_EDGE_INSETS)
        if (value != nil) {
            var edgeInsets: UIEdgeInsets = UIEdgeInsetsZero
            value.getValue(&edgeInsets)
            return edgeInsets
        } else {
            return UIEdgeInsetsZero
        }
    }

    override public func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {

        if UIEdgeInsetsEqualToEdgeInsets(self.hitTestEdgeInsets(), UIEdgeInsetsZero) || !self.enabled || self.hidden  {
            return super.pointInside(point, withEvent: event)
        }

        let relativeFrame = self.bounds
        let hitFrame = UIEdgeInsetsInsetRect(relativeFrame, self.hitTestEdgeInsets());

        return CGRectContainsPoint(hitFrame, point)
    }

}

Use:

var insets: UIEdgeInsets = UIEdgeInsetsMake(-20, -20, -20, -20)
button.setHitTestEdgeInsets(&insets)

Upvotes: 1

Related Questions