2016-03-30 22 views
1

Ich habe eine UIButton, die 36x36 ist und ich möchte Padding (im Wesentlichen wie CSS) hinzufügen, so dass der berührbare Bereich the recommended 44x44 ist.Hinzufügen von Padding zu einem UIButton, das keinen Text hat

Ich habe versucht, Edge-Einfügungen über den Interface Builder und auch mit dem Code unten, aber nichts, was ich versucht habe, erhöht den berührbaren Bereich.

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

Funktioniert ein Kanteneinschub nur mit Schaltflächen, die Text enthalten?

Update:

  • Ich habe versucht Einstellung contentEdgeInsets, imageEdgeInsets und titleEdgeInsets ohne Erfolg.

  • Ich könnte berührbaren Bereich erweitern, indem Sie das eigentliche Bild bearbeiten und den Rand um das Symbol erhöhen. (. Dies wäre nicht der bevorzugte Weg sein, aber ich werde wahrscheinlich diesen Weg gehen, wenn ich nicht eine andere Lösung finden können)

+0

prüfen diese http://stackoverflow.com/questions/808503/uibutton-making-the-hit-area-larger-than-the-default-hit-area – schmidt9

+0

, die aus objektiven ist -c. Ich benutze Swift. –

Antwort

1

überschrieb ich in Swift this Antwort und es funktioniert:

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) 
    } 

} 

Verwendung:

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