Alignement du texte et de l'image sur UIButton avec les ensembles imageEdgeInsets et titleEdgeInsets

j'aimerais placer une icône à gauche des deux lignes de texte de sorte qu'il y ait environ 2-3 pixels d'espace entre l'image et le début du texte. Le contrôle lui-même est aligné au centre horizontalement (mis par Interface Builder)

le bouton ressemblerait à quelque chose comme ceci:

|                  |
|[Image] Add To    |
|        Favorites |

j'essaie de le configurer avec des gainsetscontentedgeinset, imageEdgeInsets et titleEdgeInsets en vain. Je comprends qu'une valeur négative développe le bord tandis qu'une valeur positive réduit pour le déplacer plus près du centre.

j'ai essayé:

[button setTitleEdgeInsets:UIEdgeInsetsMake(0, -image.size.width, 0, 0)];
[button setImageEdgeInsets:UIEdgeInsetsMake(0, button.titleLabel.bounds.size.width, 0, 0)];

mais cela ne l'affiche pas correctement. J'ai modifié les valeurs, mais passer de -5 à -10 sur la valeur de gauche ne semble pas la déplacer de la manière attendue. -10 va scoot le texte tout le chemin vers la gauche donc je m'attendais à -5 pour scoot le mi chemin à partir du côté gauche mais il ne le fait pas.

Quelle est la logique derrière des inserts? Je ne suis pas familier avec le placement d'images et la terminologie connexe.

j'ai utilisé cette question comme référence mais quelque chose à propos de mes valeurs n'est pas juste. UIButton: comment centrer une image et un texte en utilisant desenseignements imageEdgeInsets et titleEdgeInsets?

217
demandé sur Community 2010-12-30 20:09:28

11 réponses

je suis d'accord que la documentation sur imageEdgeInsets et titleEdgeInsets devrait être meilleure, mais j'ai compris comment obtenir le positionnement correct sans recourir à l'essai et l'erreur.

l'idée générale est ici à cette question , mais c'était si vous vouliez à la fois texte et image centrée. Nous ne voulons pas que l'image et le texte sera centré individuellement, nous voulons que l'image et le texte soit centré ensemble, comme une seule entité. C'est en effet ce que l' UIButton le fait déjà donc nous avons simplement besoin d'ajuster l'espacement.

CGFloat spacing = 10; // the amount of spacing to appear between image and title
tabBtn.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);
tabBtn.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);

j'ai aussi transformé cela en une catégorie pour UIButton donc il sera facile à utiliser:

UIButton+Position.h

@interface UIButton(ImageTitleCentering)

-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing;

@end

UIButton+Position.m

@implementation UIButton(ImageTitleCentering)

-(void) centerButtonAndImageWithSpacing:(CGFloat)spacing {
    self.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, spacing);
    self.titleEdgeInsets = UIEdgeInsetsMake(0, spacing, 0, 0);
}

@end

donc maintenant tout ce que j'ai à faire est:

[button centerButtonAndImageWithSpacing:10];

et j'obtiens ce dont j'ai besoin à chaque fois. Aucun plus jouer avec les inserts de bord manuellement.

MODIFIER: Changer l'Image et le Texte

en réponse à @Javal dans les commentaires

avec ce même mécanisme, on peut échanger l'image et le texte. Pour effectuer l'échange, il suffit d'utiliser un espacement négatif, mais aussi d'inclure la largeur du texte et de l'image. Cela nécessitera des cadres à être connue et mise en page déjà.

[self.view layoutIfNeeded];
CGFloat flippedSpacing = -(desiredSpacing + button.currentImage.size.width + button.titleLabel.frame.size.width);
[button centerButtonAndImageWithSpacing:flippedSpacing];

Bien sûr, vous voudrez probablement faire une méthode agréable pour cela, en ajoutant potentiellement une méthode de deuxième catégorie, ceci est laissé comme un exercice au lecteur.

339
répondu Kekoa 2017-05-23 11:54:50

je suis un peu en retard à cette fête, mais je pense que j'ai quelque chose d'utile à ajouter.

la réponse de Kekoa est excellente mais, comme RonLugge le mentionne, elle peut faire en sorte que le bouton ne respecte plus sizeToFit ou, ce qui est plus important, faire en sorte que le bouton clipse son contenu lorsqu'il est de taille intrinsèque. Oups!

mais d'Abord,

une brève explication de la façon dont je crois que imageEdgeInsets et titleEdgeInsets travail:

Le docs pour imageEdgeInsets ont ceci à dire:

utilisez cette propriété pour redimensionner et repositionner le rectangle de dessin effectif pour l'image bouton. Vous pouvez spécifier une valeur différente pour chacun des quatre insets (haut, gauche, bas, droite). Une valeur positive rétrécit, ou insète, ce bord-le déplaçant plus près du centre du bouton. 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 pensée de cette façon, et se comporte comment UIEdgeInsets font habituellement. Fondamentalement, le cadre de l'image (ou le titre, avec titleEdgeInsets ) est déplacé vers l'intérieur pour les insets positifs et vers l'extérieur pour les insets négatifs.

OK, et alors?

je suis il y! Voici ce que vous avez par défaut, définir une image et un titre (la bordure de bouton est vert juste pour montrer où il est):

Starting image; no space between title and image.

Quand vous voulez 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 des cadres de ces éléments, mais juste leur position. Lorsque vous commencez à penser de cette façon, le changement nécessaire à la catégorie excellente de Kekoa devient clair:

@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 , dites-vous, quand je fais cela, je reçois ceci:

Spacing is good, but the image and title are outside the view's frame.

Oh oui! J'ai oublié, le docs m'a prévenu à ce sujet. Ils disent:

cette propriété n'est utilisé que pour positionner l'image lors de la mise en page. Le bouton n'utilise pas cette propriété pour déterminer intrinsicContentSize et sizeThatFits: .

mais là est une propriété qui peut aider, et qui est contentEdgeInsets . Les docs pour dire que, dans la partie:

Le bouton utilise cette propriété pour déterminer intrinsicContentSize et sizeThatFits: .

ça sonne bien. Alors retouchons 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?

Spacing and frame are now correct.

Ressemble à un gagnant pour moi.


travailler chez Swift et ne veulent pas réfléchir du tout? Voici la version finale de L'extension dans Swift:

extension UIButton {
    func centerTextAndImage(spacing: CGFloat) {
        let insetAmount = spacing / 2
        imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount, bottom: 0, right: insetAmount)
        titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: -insetAmount)
        contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
    }
}
314
répondu ravron 2018-04-25 15:07:46

dans interface Builder. Sélectionnez le UIButton - > Attributes Inspector - > Edge=Title et modifiez les insets edge

37
répondu Freeman 2012-02-20 14:38:54

aussi si vous voulez faire quelque chose de similaire à

enter image description here

Vous avez besoin de

1.Régler l'alignement horizontal et vertical du bouton sur

enter image description here

  1. trouver toutes les valeurs requises et régler UIImageEdgeInsets

            CGSize buttonSize = button.frame.size;
            NSString *buttonTitle = button.titleLabel.text;
            CGSize titleSize = [buttonTitle sizeWithAttributes:@{ NSFontAttributeName : [UIFont camFontZonaProBoldWithSize:12.f] }];
            UIImage *buttonImage = button.imageView.image;
            CGSize buttonImageSize = buttonImage.size;
    
            CGFloat offsetBetweenImageAndText = 10; //vertical space between image and text
    
            [button setImageEdgeInsets:UIEdgeInsetsMake((buttonSize.height - (titleSize.height + buttonImageSize.height)) / 2 - offsetBetweenImageAndText,
                                                        (buttonSize.width - buttonImageSize.width) / 2,
                                                        0,0)];                
            [button setTitleEdgeInsets:UIEdgeInsetsMake((buttonSize.height - (titleSize.height + buttonImageSize.height)) / 2 + buttonImageSize.height + offsetBetweenImageAndText,
                                                        titleSize.width + [button imageEdgeInsets].left > buttonSize.width ? -buttonImage.size.width  +  (buttonSize.width - titleSize.width) / 2 : (buttonSize.width - titleSize.width) / 2 - buttonImage.size.width,
                                                        0,0)];
    

cela arrangera votre titre et votre image sur le bouton.

S'il vous plaît noter cette mise à jour sur chaque relayout


Swift

import UIKit

extension UIButton {
    // MARK: - UIButton+Aligment

    func alignContentVerticallyByCenter(offset:CGFloat = 10) {
        let buttonSize = frame.size

        if let titleLabel = titleLabel,
            let imageView = imageView {

            if let buttonTitle = titleLabel.text,
                let image = imageView.image {
                let titleString:NSString = NSString(string: buttonTitle)
                let titleSize = titleString.sizeWithAttributes([
                    NSFontAttributeName : titleLabel.font
                    ])
                let buttonImageSize = image.size

                let topImageOffset = (buttonSize.height - (titleSize.height + buttonImageSize.height + offset)) / 2
                let leftImageOffset = (buttonSize.width - buttonImageSize.width) / 2
                imageEdgeInsets = UIEdgeInsetsMake(topImageOffset,
                                                   leftImageOffset,
                                                   0,0)

                let titleTopOffset = topImageOffset + offset + buttonImageSize.height
                let leftTitleOffset = (buttonSize.width - titleSize.width) / 2 - image.size.width

                titleEdgeInsets = UIEdgeInsetsMake(titleTopOffset,
                                                   leftTitleOffset,
                                                   0,0)
            }
        }
    }
}
32
répondu gbk 2016-09-23 12:54:47

, Vous pouvez éviter beaucoup de problèmes à l'aide de cette --

myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;   
myButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;

cela alignera automatiquement tout votre contenu à gauche (ou où vous le voulez)

Swift 3:

myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left;   
myButton.contentVerticalAlignment = UIControlContentVerticalAlignment.center;
26
répondu Nishant 2018-09-20 02:56:08

dans Xcode 8.0 vous pouvez simplement le faire en changeant insets en inspecteur de taille.

sélectionnez L'UIButton -> attributs Inspector -> allez à taille inspector et modifiez le contenu, l'image et les insets de titre.

enter image description here

et si vous voulez changer l'image sur le côté droit vous pouvez simplement changer la propriété sémantique à Force Right-to-left dans L'attribut inspecteur.

enter image description here

17
répondu Sahil 2017-03-29 04:22:15

je suis un peu en retard à cette fête aussi, mais je pense que j'ai quelque chose d'utile à ajouter :o).

j'ai créé une sous-classe UIButton dont le but est de pouvoir choisir l'emplacement de l'image du bouton, soit verticalement, soit horizontalement.

Cela signifie que vous pouvez faire ce genre de boutons : different kind of buttons

Ici les détails sur la façon de créer ces boutons avec ma classe :

func makeButton (imageVerticalAlignment:LayoutableButton.VerticalAlignment, imageHorizontalAlignment:LayoutableButton.HorizontalAlignment, title:String) -> LayoutableButton {
    let button = LayoutableButton ()

    button.imageVerticalAlignment = imageVerticalAlignment
    button.imageHorizontalAlignment = imageHorizontalAlignment

    button.setTitle(title, for: .normal)

    // add image, border, ...

    return button
}

let button1 = makeButton(imageVerticalAlignment: .center, imageHorizontalAlignment: .left, title: "button1")
let button2 = makeButton(imageVerticalAlignment: .center, imageHorizontalAlignment: .right, title: "button2")
let button3 = makeButton(imageVerticalAlignment: .top, imageHorizontalAlignment: .center, title: "button3")
let button4 = makeButton(imageVerticalAlignment: .bottom, imageHorizontalAlignment: .center, title: "button4")
let button5 = makeButton(imageVerticalAlignment: .bottom, imageHorizontalAlignment: .center, title: "button5")
button5.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)

pour ce faire, j'ai ajouté 2 attributs: imageVerticalAlignment et imageHorizontalAlignment . Bien sûr, si votre bouton n'a qu'une image ou un titre ... ne pas utiliser cette classe à tous !

j'ai aussi ajouté un attribut nommé imageToTitleSpacing qui vous permettent d'ajuster l'espace entre le titre et l'image.

cette classe faire de son mieux pour être compatible si vous voulez utiliser imageEdgeInsets , titleEdgeInsets et contentEdgeInsets directement ou en combinaison avec les nouveaux attributs de layout.

comme nous l'explique @ravron, je fais de mon mieux pour que le bouton content edge soit correct (comme vous pouvez le voir avec les bordures rouges).

vous pouvez également l'utiliser dans Interface Builder:

  1. Créer un UIButton
  2. changer la classe de bouton
  3. Ajuster Layoutable Attributs à l'aide de "centre", "haut", "bas", "gauche" ou "droite" button attributes

ici le code ( gist ):

@IBDesignable
class LayoutableButton: UIButton {

    enum VerticalAlignment : String {
        case center, top, bottom, unset
    }


    enum HorizontalAlignment : String {
        case center, left, right, unset
    }


    @IBInspectable
    var imageToTitleSpacing: CGFloat = 8.0 {
        didSet {
            setNeedsLayout()
        }
    }


    var imageVerticalAlignment: VerticalAlignment = .unset {
        didSet {
            setNeedsLayout()
        }
    }

    var imageHorizontalAlignment: HorizontalAlignment = .unset {
        didSet {
            setNeedsLayout()
        }
    }

    @available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'imageVerticalAlignment' instead.")
    @IBInspectable
    var imageVerticalAlignmentName: String {
        get {
            return imageVerticalAlignment.rawValue
        }
        set {
            if let value = VerticalAlignment(rawValue: newValue) {
                imageVerticalAlignment = value
            } else {
                imageVerticalAlignment = .unset
            }
        }
    }

    @available(*, unavailable, message: "This property is reserved for Interface Builder. Use 'imageHorizontalAlignment' instead.")
    @IBInspectable
    var imageHorizontalAlignmentName: String {
        get {
            return imageHorizontalAlignment.rawValue
        }
        set {
            if let value = HorizontalAlignment(rawValue: newValue) {
                imageHorizontalAlignment = value
            } else {
                imageHorizontalAlignment = .unset
            }
        }
    }

    var extraContentEdgeInsets:UIEdgeInsets = UIEdgeInsets.zero

    override var contentEdgeInsets: UIEdgeInsets {
        get {
            return super.contentEdgeInsets
        }
        set {
            super.contentEdgeInsets = newValue
            self.extraContentEdgeInsets = newValue
        }
    }

    var extraImageEdgeInsets:UIEdgeInsets = UIEdgeInsets.zero

    override var imageEdgeInsets: UIEdgeInsets {
        get {
            return super.imageEdgeInsets
        }
        set {
            super.imageEdgeInsets = newValue
            self.extraImageEdgeInsets = newValue
        }
    }

    var extraTitleEdgeInsets:UIEdgeInsets = UIEdgeInsets.zero

    override var titleEdgeInsets: UIEdgeInsets {
        get {
            return super.titleEdgeInsets
        }
        set {
            super.titleEdgeInsets = newValue
            self.extraTitleEdgeInsets = newValue
        }
    }

    //Needed to avoid IB crash during autolayout
    override init(frame: CGRect) {
        super.init(frame: frame)
    }


    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        self.imageEdgeInsets = super.imageEdgeInsets
        self.titleEdgeInsets = super.titleEdgeInsets
        self.contentEdgeInsets = super.contentEdgeInsets
    }

    override func layoutSubviews() {
        if let imageSize = self.imageView?.image?.size,
            let font = self.titleLabel?.font,
            let textSize = self.titleLabel?.attributedText?.size() ?? self.titleLabel?.text?.size(attributes: [NSFontAttributeName: font]) {

            var _imageEdgeInsets = UIEdgeInsets.zero
            var _titleEdgeInsets = UIEdgeInsets.zero
            var _contentEdgeInsets = UIEdgeInsets.zero

            let halfImageToTitleSpacing = imageToTitleSpacing / 2.0

            switch imageVerticalAlignment {
            case .bottom:
                _imageEdgeInsets.top = (textSize.height + imageToTitleSpacing) / 2.0
                _imageEdgeInsets.bottom = (-textSize.height - imageToTitleSpacing) / 2.0
                _titleEdgeInsets.top = (-imageSize.height - imageToTitleSpacing) / 2.0
                _titleEdgeInsets.bottom = (imageSize.height + imageToTitleSpacing) / 2.0
                _contentEdgeInsets.top = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
                _contentEdgeInsets.bottom = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
                //only works with contentVerticalAlignment = .center
                contentVerticalAlignment = .center
            case .top:
                _imageEdgeInsets.top = (-textSize.height - imageToTitleSpacing) / 2.0
                _imageEdgeInsets.bottom = (textSize.height + imageToTitleSpacing) / 2.0
                _titleEdgeInsets.top = (imageSize.height + imageToTitleSpacing) / 2.0
                _titleEdgeInsets.bottom = (-imageSize.height - imageToTitleSpacing) / 2.0
                _contentEdgeInsets.top = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
                _contentEdgeInsets.bottom = (min (imageSize.height, textSize.height) + imageToTitleSpacing) / 2.0
                //only works with contentVerticalAlignment = .center
                contentVerticalAlignment = .center
            case .center:
                //only works with contentVerticalAlignment = .center
                contentVerticalAlignment = .center
                break
            case .unset:
                break
            }

            switch imageHorizontalAlignment {
            case .left:
                _imageEdgeInsets.left = -halfImageToTitleSpacing
                _imageEdgeInsets.right = halfImageToTitleSpacing
                _titleEdgeInsets.left = halfImageToTitleSpacing
                _titleEdgeInsets.right = -halfImageToTitleSpacing
                _contentEdgeInsets.left = halfImageToTitleSpacing
                _contentEdgeInsets.right = halfImageToTitleSpacing
            case .right:
                _imageEdgeInsets.left = textSize.width + halfImageToTitleSpacing
                _imageEdgeInsets.right = -textSize.width - halfImageToTitleSpacing
                _titleEdgeInsets.left = -imageSize.width - halfImageToTitleSpacing
                _titleEdgeInsets.right = imageSize.width + halfImageToTitleSpacing
                _contentEdgeInsets.left = halfImageToTitleSpacing
                _contentEdgeInsets.right = halfImageToTitleSpacing
            case .center:
                _imageEdgeInsets.left = textSize.width / 2.0
                _imageEdgeInsets.right = -textSize.width / 2.0
                _titleEdgeInsets.left = -imageSize.width / 2.0
                _titleEdgeInsets.right = imageSize.width / 2.0
                _contentEdgeInsets.left = -((imageSize.width + textSize.width) - max (imageSize.width, textSize.width)) / 2.0
                _contentEdgeInsets.right = -((imageSize.width + textSize.width) - max (imageSize.width, textSize.width)) / 2.0
            case .unset:
                break
            }

            _contentEdgeInsets.top += extraContentEdgeInsets.top
            _contentEdgeInsets.bottom += extraContentEdgeInsets.bottom
            _contentEdgeInsets.left += extraContentEdgeInsets.left
            _contentEdgeInsets.right += extraContentEdgeInsets.right

            _imageEdgeInsets.top += extraImageEdgeInsets.top
            _imageEdgeInsets.bottom += extraImageEdgeInsets.bottom
            _imageEdgeInsets.left += extraImageEdgeInsets.left
            _imageEdgeInsets.right += extraImageEdgeInsets.right

            _titleEdgeInsets.top += extraTitleEdgeInsets.top
            _titleEdgeInsets.bottom += extraTitleEdgeInsets.bottom
            _titleEdgeInsets.left += extraTitleEdgeInsets.left
            _titleEdgeInsets.right += extraTitleEdgeInsets.right

            super.imageEdgeInsets = _imageEdgeInsets
            super.titleEdgeInsets = _titleEdgeInsets
            super.contentEdgeInsets = _contentEdgeInsets

        } else {
            super.imageEdgeInsets = extraImageEdgeInsets
            super.titleEdgeInsets = extraTitleEdgeInsets
            super.contentEdgeInsets = extraContentEdgeInsets
        }

        super.layoutSubviews()
    }
}
16
répondu gbitaudeau 2017-03-03 09:38:17

une petite addition à Riley Avron réponse aux changements de Compte locale:

extension UIButton {
    func centerTextAndImage(spacing: CGFloat) {
        let insetAmount = spacing / 2
        let writingDirection = UIApplication.sharedApplication().userInterfaceLayoutDirection
        let factor: CGFloat = writingDirection == .LeftToRight ? 1 : -1

        self.imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount*factor, bottom: 0, right: insetAmount*factor)
        self.titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount*factor, bottom: 0, right: -insetAmount*factor)
        self.contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
    }
}
7
répondu orxelm 2016-04-03 13:36:43

Swift 4.x

extension UIButton {
    func centerTextAndImage(spacing: CGFloat) {
        let insetAmount = spacing / 2
        let writingDirection = UIApplication.shared.userInterfaceLayoutDirection
        let factor: CGFloat = writingDirection == .leftToRight ? 1 : -1

        self.imageEdgeInsets = UIEdgeInsets(top: 0, left: -insetAmount*factor, bottom: 0, right: insetAmount*factor)
        self.titleEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount*factor, bottom: 0, right: -insetAmount*factor)
        self.contentEdgeInsets = UIEdgeInsets(top: 0, left: insetAmount, bottom: 0, right: insetAmount)
    }
}

Utilisation :

button.centerTextAndImage(spacing: 10.0)
5
répondu Hemang 2017-12-29 11:09:37

voici un exemple simple de la façon d'utiliser imageEdgeInsets Cela fera un bouton de 30x30 avec une zone hittable 10 pixels plus grand tout autour (50x50)

    var expandHittableAreaAmt : CGFloat = 10
    var buttonWidth : CGFloat = 30
    var button = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
    button.frame = CGRectMake(0, 0, buttonWidth+expandHittableAreaAmt, buttonWidth+expandHittableAreaAmt)
    button.imageEdgeInsets = UIEdgeInsetsMake(expandHittableAreaAmt, expandHittableAreaAmt, expandHittableAreaAmt, expandHittableAreaAmt)
    button.setImage(UIImage(named: "buttonImage"), forState: .Normal)
    button.addTarget(self, action: "didTouchButton:", forControlEvents:.TouchUpInside)
1
répondu Harris 2014-11-10 20:48:15

une manière élégante dans Swift 3 et mieux comprendre:

override func imageRect(forContentRect contentRect: CGRect) -> CGRect {
    let leftMargin:CGFloat = 40
    let imgWidth:CGFloat = 24
    let imgHeight:CGFloat = 24
    return CGRect(x: leftMargin, y: (contentRect.size.height-imgHeight) * 0.5, width: imgWidth, height: imgHeight)
}

override func titleRect(forContentRect contentRect: CGRect) -> CGRect {
    let leftMargin:CGFloat = 80
    let rightMargin:CGFloat = 80
    return CGRect(x: leftMargin, y: 0, width: contentRect.size.width-leftMargin-rightMargin, height: contentRect.size.height)
}
override func backgroundRect(forBounds bounds: CGRect) -> CGRect {
    let leftMargin:CGFloat = 10
    let rightMargin:CGFloat = 10
    let topMargin:CGFloat = 10
    let bottomMargin:CGFloat = 10
    return CGRect(x: leftMargin, y: topMargin, width: bounds.size.width-leftMargin-rightMargin, height: bounds.size.height-topMargin-bottomMargin)
}
override func contentRect(forBounds bounds: CGRect) -> CGRect {
    let leftMargin:CGFloat = 5
    let rightMargin:CGFloat = 5
    let topMargin:CGFloat = 5
    let bottomMargin:CGFloat = 5
    return CGRect(x: leftMargin, y: topMargin, width: bounds.size.width-leftMargin-rightMargin, height: bounds.size.height-topMargin-bottomMargin)
}
0
répondu teonicel 2017-09-04 19:50:22