Ou vous pouvez simplement utiliser cette catégorie :
ObjC
@interface UIButton (VerticalLayout)
- (void)centerVerticallyWithPadding:(float)padding;
- (void)centerVertically;
@end
@implementation UIButton (VerticalLayout)
- (void)centerVerticallyWithPadding:(float)padding {
CGSize imageSize = self.imageView.frame.size;
CGSize titleSize = self.titleLabel.frame.size;
CGFloat totalHeight = (imageSize.height + titleSize.height + padding);
self.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight - imageSize.height),
0.0f,
0.0f,
- titleSize.width);
self.titleEdgeInsets = UIEdgeInsetsMake(0.0f,
- imageSize.width,
- (totalHeight - titleSize.height),
0.0f);
self.contentEdgeInsets = UIEdgeInsetsMake(0.0f,
0.0f,
titleSize.height,
0.0f);
}
- (void)centerVertically {
const CGFloat kDefaultPadding = 6.0f;
[self centerVerticallyWithPadding:kDefaultPadding];
}
@end
Extension rapide
extension UIButton {
func centerVertically(padding: CGFloat = 6.0) {
guard
let imageViewSize = self.imageView?.frame.size,
let titleLabelSize = self.titleLabel?.frame.size else {
return
}
let totalHeight = imageViewSize.height + titleLabelSize.height + padding
self.imageEdgeInsets = UIEdgeInsets(
top: -(totalHeight - imageViewSize.height),
left: 0.0,
bottom: 0.0,
right: -titleLabelSize.width
)
self.titleEdgeInsets = UIEdgeInsets(
top: 0.0,
left: -imageViewSize.width,
bottom: -(totalHeight - titleLabelSize.height),
right: 0.0
)
self.contentEdgeInsets = UIEdgeInsets(
top: 0.0,
left: 0.0,
bottom: titleLabelSize.height,
right: 0.0
)
}
}
Suggestion : Si la hauteur du bouton est inférieure à totalHeight
l'image sera dessinée en dehors des frontières.
imageEdgeInset.top
devrait être :
max(0, -(totalHeight - imageViewSize.height))
0 votes
Il est assez facile et faisable de créer une sous-classe personnalisée de UIbutton contenant une UIImage et une UILabel, positionnée comme vous auriez besoin...
7 votes
Ou utilisez simplement un UIButton et un UILabel.
0 votes
Pour contrôler précisément la taille et la mise en page automatique, vous pouvez essayer ceci :
https://github.com/albert-zhang/AZCenterLabelButton
( Lien )0 votes
Fonctionne bien avec cette solution stackoverflow.com/a/59666154/1576134
0 votes
En Xcode 13 Il y a une option dans le storyboard pour changer le bouton. Placement option pour top qui fonctionnent bien pour moi