J'utilise UIButton
avec la mise en page automatique. Lorsque les images sont petites, la zone de prise est également réduite. Je pourrais imaginer plusieurs approches pour résoudre ce problème:
Outre les deux approches ci-dessus, existe-t-il une meilleure solution pour augmenter la surface de prise d'un UIButton?
Vous pouvez simplement ajuster le contenu du bouton pour obtenir la taille souhaitée. En code, cela ressemblera à ceci:
button.contentEdgeInsets = UIEdgeInsets (en haut: 12, à gauche: 16, en bas: 12, à droite: 16)
// ou si vous souhaitez spécifiquement ajuster l'image, utilisez plutôt button.imageEdgeInsets
Dans le constructeur d'interface, cela ressemblera à ceci:
Très facile. Créez une classe UIButton personnalisée. Puis substituez la méthode pointInside ... et modifiez la valeur à votre guise.
#import "CustomButton.h"
@implementation CustomButton
-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
CGRect newArea = CGRectMake(self.bounds.Origin.x - 10, self.bounds.Origin.y - 10, self.bounds.size.width + 20, self.bounds.size.height + 20);
return CGRectContainsPoint(newArea, point);
}
@end
Il faudra plus de zone tactile de 10 points pour tous les côtés.
Vous pouvez définir le bouton EdgeInsets dans le storyboard ou via le code. La taille du bouton doit être plus grande en hauteur et en largeur que l'image définie pour le bouton.
Remarque: après Xcode8, la définition du contenu est disponible dans Inspecor
Vous pouvez également utiliser la vue d'image avec le geste de toucher pour agir tout en tapant sur la vue d'image. Cochez la case Interaction utilisateur activée pour que l’image visualise le storyboard afin que les gestes fonctionnent . Agrandissez l’affichage de l’image plus grande que l’image et réglez-la sur l’image./constructeur d'interface.
Vous pouvez appuyer sur l'image pour effectuer une action.
J'espère que ça vous sera utile.
Swift 4 • Xcode 9
Vous pouvez sélectionner par programme comme
Pour image -
button.imageEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
Pour le titre -
button.titleEdgeInsets = UIEdgeInsets(top: 8, left: 8, bottom: 8, right: 8)
Je confirme que la solution de Syed fonctionne bien, même avec l'autolayout. Voici la version 4.x de Swift:
import UIKit
class BeepSmallButton: UIButton {
// MARK: - Functions
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let newArea = CGRect(
x: self.bounds.Origin.x - 5.0,
y: self.bounds.Origin.y - 5.0,
width: self.bounds.size.width + 10.0,
height: self.bounds.size.height + 20.0
)
return newArea.contains(point)
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Sous-classe UIButton
et ajouter cette fonction
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let verticalInset = CGFloat(10)
let horizontalInset = CGFloat(10)
let largerArea = CGRect(
x: self.bounds.Origin.x - horizontalInset,
y: self.bounds.Origin.y - verticalInset,
width: self.bounds.size.width + horizontalInset*2,
height: self.bounds.size.height + verticalInset*2
)
return largerArea.contains(point)
}