Mise à jour : Swift 3
class ButtonIconRight: UIButton {
override func imageRect(forContentRect contentRect:CGRect) -> CGRect {
var imageFrame = super.imageRect(forContentRect: contentRect)
imageFrame.origin.x = super.titleRect(forContentRect: contentRect).maxX - imageFrame.width
return imageFrame
}
override func titleRect(forContentRect contentRect:CGRect) -> CGRect {
var titleFrame = super.titleRect(forContentRect: contentRect)
if (self.currentImage != nil) {
titleFrame.origin.x = super.imageRect(forContentRect: contentRect).minX
}
return titleFrame
}
}
Réponse originale pour Swift 2 :
Une solution qui gère tous les alignements horizontaux, avec un exemple de mise en œuvre en Swift. Il suffit de traduire en Objective-C si nécessaire.
class ButtonIconRight: UIButton {
override func imageRectForContentRect(contentRect:CGRect) -> CGRect {
var imageFrame = super.imageRectForContentRect(contentRect)
imageFrame.origin.x = CGRectGetMaxX(super.titleRectForContentRect(contentRect)) - CGRectGetWidth(imageFrame)
return imageFrame
}
override func titleRectForContentRect(contentRect:CGRect) -> CGRect {
var titleFrame = super.titleRectForContentRect(contentRect)
if (self.currentImage != nil) {
titleFrame.origin.x = CGRectGetMinX(super.imageRectForContentRect(contentRect))
}
return titleFrame
}
}
Il convient également de noter qu'il gère très bien les incrustations d'images et de titres.
Inspiré de la réponse de jasongregori ;)
0 votes
Pour ajouter un autre "hack" à la liste croissante : vous pouvez définir l'attributTitle du bouton comme une chaîne attribuée contenant le titre du bouton, un espace et l'image (sous forme de NSTextAttachment). Il se peut que vous deviez modifier les limites de la pièce jointe pour qu'elle s'aligne comme vous le souhaitez (cf. stackoverflow.com/questions/26105803/ ).