Je suis un peu en retard pour cette partie, mais je pense que j'ai quelque chose d'utile à ajouter.
Kekoa la réponse est grand, mais, comme RonLugge mentionne, il peut faire le bouton n'est plus respecter sizeToFit
ou, plus important encore, peut causer le bouton pour le clip de son contenu lorsqu'elle est intrinsèquement de taille moyenne. Oups!
Mais d'abord,
Une brève explication de la façon dont, je crois, imageEdgeInsets
et titleEdgeInsets
travail:
Les docs pour imageEdgeInsets
sont les suivantes-à-dire dans la partie:
Utilisez cette propriété pour redimensionner et repositionner le tracé effectif rectangle de l'image du bouton. Vous pouvez spécifier une valeur différente pour chacun des quatre encarts (en haut, à gauche, en bas, à droite). Une valeur positive se rétrécit, ou encarts, ce bord-le rapprocher du centre de la touche. Une valeur négative se développe, ou dilate, ce bord.
Je crois que cette documentation a été écrite en imaginant que le bouton n'a pas de titre, juste une image. Il fait beaucoup plus de sens de la pensée de cette façon, et se comporte comment UIEdgeInsets
habituellement. En gros, l'image de l'image (ou le titre, titleEdgeInsets
) est déplacé vers l'intérieur pour le positif encarts et vers l'extérieur pour les façades latérales.
OK, et alors?
Je vais y venir! Voici ce que vous avez par défaut, le réglage d'une image et un titre (le contour du bouton est vert juste pour montrer où il est):
Lorsque vous souhaitez que l'espacement entre une image et un titre, sans causer soit d'être écrasés, vous devez définir quatre différents encarts, deux sur chaque image et le titre. C'est parce que vous ne voulez pas changer les tailles de ces éléments " les cadres, mais seulement leurs positions. Lorsque vous commencez à penser de cette façon, le changement nécessaire à Kekoa la catégorie "excellent" devient claire:
@implementation UIButton(ImageTitleCentering)
-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
}
@end
Mais attendez, vous dites, quand je fais ça, j'obtiens ceci:
Oh que oui! J'ai oublié, les docs m'a averti à ce sujet. Ils disent, en partie:
Cette propriété est utilisée uniquement pour le positionnement de l'image lors de la présentation. Le bouton ne pas utiliser cette propriété pour déterminer intrinsicContentSize
et sizeThatFits:
.
Mais il est une propriété qui peut aider, et que l' contentEdgeInsets
. Les docs pour dire que, dans le cadre:
Le bouton utilise cette propriété pour déterminer intrinsicContentSize
et sizeThatFits:
.
Qui sonne bien. Donc, nous allons modifier la catégorie, une fois de plus:
@implementation UIButton(ImageTitleCentering)
-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing {
CGFloat insetAmount = spacing / 2.0;
self.imageEdgeInsets = UIEdgeInsetsMake(0, -insetAmount, 0, insetAmount);
self.titleEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, -insetAmount);
self.contentEdgeInsets = UIEdgeInsetsMake(0, insetAmount, 0, insetAmount);
}
@end
Et qu'obtenez-vous?
Ressemble à un gagnant pour moi.