it-swarm.com.de

Wie kann man den Auswahlbereich von UIButton vergrößern?

Ich habe die UIButton programmgesteuert gemacht 

togglebutton = [UIButton buttonWithType:UIButtonTypeCustom];
togglebutton.frame = CGRectMake(42, 15, 80, 21);
[togglebutton addTarget:self action:@selector(toggleview)   
forControlEvents:UIControlEventTouchUpInside];
[togglebutton setImage:[UIImage imageNamed:@"squ.png"] forState:UIControlStateNormal];
[buttonView addSubview:togglebutton];

enter image description here

Es wird als die rechte Schaltfläche in dem obigen Bild angesehen. Die Anforderung ist nun, dass der Auswahlbereich dieser Schaltfläche mehr als das Uibutton-Bild sein soll. Damit kann der Benutzer die Schaltfläche leicht anklicken, indem er in der Nähe einer bestimmten Schaltfläche berührt. 

[togglebutton setImageEdgeInsets: UIEdgeInsetsMake( 0, -30, 0, -25)];

Ich habe versucht, den image inset einzustellen, aber es macht den image irregular. Bitte sehen Sie sich dieses Problem an.

28
Minkle Garg

Sie können dies erreichen, indem Sie die Variable contentEdgeInsets der Schaltfläche einstellen, zum Beispiel:

toggleButton.contentEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0); //set as you require 
44
Nitin Gohel

Für Swift

Sie können func 'pointInside' der UIView-Klasse überschreiben, um den klickbaren Bereich zu erweitern.

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
    // padding : local variable of your custom UIView, CGFloat
    // you can change clickable area dynamically by setting this value.

    let newBound = CGRect(
        x: self.bounds.Origin.x - padding,
        y: self.bounds.Origin.y - padding,
        width: self.bounds.width + 2 * padding,
        height: self.bounds.height + 2 * padding
    )
    return CGRectContainsPoint(newBound, point)
}

Verwenden Sie so,

class MyButton: UIButton {
    var padding = CGFloat(0) // default value

    //func pointInside at here!!
}

Wenn Sie die Schaltfläche initialisieren, legen Sie Ihre benutzerdefinierte Auffüllung fest.

func initButton() {
    let button = MyButton(frame: CGRect(x: 100, y: 100, width: 30, height: 30))
    button.padding = 10 // any value you want
    view.addSubview(button)
}

dann befindet sich Ihr Button im Frame (x: 100, y: 100, width: 30, height: 30)

der anklickbare Bereich Ihrer Schaltfläche befindet sich möglicherweise im Rahmen mit (x: 90, y: 90, Breite: 50, Höhe: 50).

** Überprüfen Sie die Überlappung mit anderen Ansichten, da der anklickbare Bereich größer ist, als er aussieht.

Update für Swift 3

override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
    let padding = CGFloat(10)
    let extendedBounds = bounds.insetBy(dx: -padding, dy: -padding)
    return extendedBounds.contains(point)
}
16
Mark

in Xcode 9 können Sie Folgendes tun:

 xcode 9 screenshot

das bedeutet, dass Sie den Bildversatz und den Inhaltsversatz kompensieren müssen, um eine zentrierte Bildpositionierung sicherzustellen.

3
Olli D-Metz

Versuchen Sie es mit der contentEdgeInsets-Eigenschaft von UIButton .

3
Adithya

Mit dem folgenden Code wird mein Problem gelöst.

    button.contentEdgeInsets = UIEdgeInsetsMake(15, 20, 10, 10);  //Change x,y,width,height as per your requirement.
2
Suraj Sonawane

Für Ziel C

Erstellen Sie diese benutzerdefinierte UIButton-Klasse und weisen Sie sie Ihrer Schaltfläche zu. Legen Sie dann diese Eigenschaftswerte in viewController fest.

//This is .h file
     #import <UIKit/UIKit.h>
        @interface CustomButton : UIButton
        @property (nonatomic) CGFloat leftArea;
        @property (nonatomic) CGFloat rightArea;
        @property (nonatomic) CGFloat topArea;
        @property (nonatomic) CGFloat bottomArea;
        @end



        //.m file is following
        #import "CustomButton.h
        @implementation CustomButton

        -(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
        {
            CGRect newArea = CGRectMake(self.bounds.Origin.x - _leftArea, self.bounds.Origin.y - _topArea, self.bounds.size.width + _leftArea + _rightArea, self.bounds.size.height + _bottomArea + _topArea);

            return CGRectContainsPoint(newArea, point);
        }
        @end

In meinem Fall ist mein Schaltflächenbild klein und ich möchte die Schaltflächenfläche vergrößern, während die uibutton-Bildgröße nicht vergrößert wird, da sie unscharf erscheint. Also habe ich den Schaltflächenrahmen erhöht und dann das Schaltflächenbild setImageEdgeInsets eingestellt. Positive Werte für edgeInsets werden verkleinert und negative Werte werden erweitert.

self.menuButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.menuButton addTarget:self
                  action:@selector(onSideBarButtonTapped:)
        forControlEvents:UIControlEventTouchDown];
[self.menuButton setImage:[UIImage imageNamed:@"menu"]
                         forState:UIControlStateNormal];
self.menuButton.frame = CGRectMake(10, 3, 40, 40);

Jetzt verkleinere ich die Bildgröße, damit die Schaltfläche nicht unscharf wirkt.

[self.menuButton setImageEdgeInsets:UIEdgeInsetsMake(10, 10, 10, 10)];
0
i.AsifNoor