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];
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.
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
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)
}
Essayez d’utiliser la propriété contentEdgeInsets
de UIButton .
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.
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)];