web-dev-qa-db-fra.com

Comment augmenter la zone de sélection de UIButton?

J'ai fait la UIButton par programme 

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

Il est regardé comme le bouton droit dans l'image ci-dessus. Désormais, il est impératif que la zone de sélection de ce bouton soit plus grande que l’image uibutton. Pour que l'utilisateur puisse cliquer sur le bouton facilement en appuyant sur la zone proche du bouton concerné. 

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

J'ai essayé de définir le image inset mais cela a rendu le image irregular. S'il vous plaît regarder cette question.

28
Minkle Garg

Vous pouvez y parvenir en définissant la variable contentEdgeInsets du bouton, par exemple:

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

Pour Swift

Vous pouvez remplacer func 'pointInside' de la classe UIView pour développer la zone cliquable.

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

Utilisez comme ça,

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

    //func pointInside at here!!
}

Lorsque vous lancez votre bouton, définissez votre remplissage personnalisé.

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

alors votre bouton est dans le cadre (x: 100, y: 100, largeur: 30, hauteur: 30)

et la zone cliquable de votre bouton peut se trouver dans le cadre avec (x: 90, y: 90, largeur: 50, hauteur: 50)

** Veillez à vérifier le chevauchement avec toute autre vue, car sa zone cliquable est plus grande qu'il n'y paraît.

Mise à jour pour 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

dans xcode 9, vous pouvez effectuer les opérations suivantes:

 xcode 9 screenshot

cela signifie que vous devez compenser le décalage de l'image et le contenu du contenu pour assurer un positionnement de l'image centré.

3
Olli D-Metz

Essayez d’utiliser la propriété contentEdgeInsets de UIButton .

3
Adithya

Le code ci-dessous résout mon problème.Ceci est très simple, Essayez ceci:

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

Pour l'objectif C

Créez cette classe UIButton personnalisée et assignez-la à votre bouton. Définissez ensuite ces valeurs de propriétés à partir de viewController.

//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

Dans mon cas, mon image de bouton est petite et je souhaite agrandir la zone du bouton sans augmenter la taille de l’image uibutton car elle est floue. J'ai donc augmenté le cadre du bouton puis défini l'image du bouton setImageEdgeInsets. Les valeurs positives pour edgeInsets seront réduites et les valeurs négatives seront étendues.

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

Maintenant, je vais réduire la taille de l'image pour que le bouton ne soit pas flou.

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