124 votes

iPhone UIButton - position de l'image

J'ai un UIButton avec le texte "Explorez l'application" et UIImage (>) Sur Interface Builder ça ressemble à ça :

[ (>) Explore the app ]

Mais j'ai besoin de placer ce UIImage APRÈS le texte :

[ Explore the app (>) ]

Comment puis-je déplacer le UIImage à droite ?

0 votes

Vous pouvez également utiliser Interface Builder. Consultez ma réponse ici : stackoverflow.com/questions/2765024/

1 votes

Il suffit d'utiliser cette sous-classe avec quelques lignes de code : github.com/k06a/RTLButton

164voto

Split Points 1816

Ma solution à ce problème est très simple

[button sizeToFit];
button.titleEdgeInsets = UIEdgeInsetsMake(0, -button.imageView.frame.size.width, 0, button.imageView.frame.size.width);
button.imageEdgeInsets = UIEdgeInsetsMake(0, button.titleLabel.frame.size.width, 0, -button.titleLabel.frame.size.width);

4 votes

Cela fonctionne très bien ! Il est difficile de comprendre le concept d'insertion dans le bord. Savez-vous pourquoi nous devons définir des inserts sur les bords gauche et droit ? En théorie, si je déplace le titre à gauche et l'image à droite, cela devrait suffire. Pourquoi dois-je définir à la fois la gauche et la droite ?

3 votes

LA MEILLEURE SOLUTION QUE J'AI TROUVÉE

2 votes

Cette réponse fonctionne parfaitement. La réponse acceptée est correcte, et pointe vers les bons documents de l'API, mais c'est la solution de copier-coller pour faire ce que le PO a demandé.

86voto

Steven Canfield Points 4277

Définissez le imageEdgeInset y titleEdgeInset pour déplacer les composants dans votre image. Vous pouvez également créer un bouton à l'aide de ces graphiques en taille réelle et l'utiliser comme image d'arrière-plan pour le bouton (puis utiliser la commande titleEdgeInsets pour déplacer le titre).

8 votes

Il est beaucoup moins coûteux de définir simplement les insets que d'implémenter une sous-classe. C'est là tout l'intérêt des insets. La manipulation des cadres pour les sous-vues (que vous n'avez pas créées) ressemble davantage à un piratage.

6 votes

@kimsnarf, vraiment ? C'est beaucoup moins de travail (et moins d'un hack) pour ajuster les encarts chaque fois que vous modifiez légèrement la taille de l'image ou la longueur du titre ?

53voto

Chris Miles Points 2504

La réponse de Raymond W est la meilleure ici. Sous-classe UIButton avec layoutSubviews personnalisés. Extrêmement simple à faire, voici une implémentation de layoutSubviews qui a fonctionné pour moi :

- (void)layoutSubviews
{
    // Allow default layout, then adjust image and label positions
    [super layoutSubviews];

    UIImageView *imageView = [self imageView];
    UILabel *label = [self titleLabel];

    CGRect imageFrame = imageView.frame;
    CGRect labelFrame = label.frame;

    labelFrame.origin.x = imageFrame.origin.x;
    imageFrame.origin.x = labelFrame.origin.x + CGRectGetWidth(labelFrame);

    imageView.frame = imageFrame;
    label.frame = labelFrame;
}

2 votes

Cette façon de faire est préférable dans le cas où vous devez gérer plusieurs boutons, mais je n'ai besoin de modifier qu'un seul bouton :)

2 votes

Si l'image du bouton est nulle, l'étiquette est mal placée, probablement parce que le UIImageView n'est pas inséré (testé sur iOS6.0). Vous devriez envisager de modifier les cadres uniquement si imageView.image n'est pas nil.

2 votes

Je suggère l'amélioration suivante à cette réponse pour que les deux vues restent centrées : 'CGFloat cumulativeWidth = CGRectGetWidth(imageFrame) + CGRectGetWidth(labelFrame) + 10 ; CGFloat excessiveWidth = CGRectGetWidth(self. bounds) - cumulativeWidth ; labelFrame.origin.x = excessiveWidth / 2 ; imageFrame.origin.x = CGRectGetMaxX(labelFrame) + 10;'

30voto

Raymond W Points 415

Qu'en est-il de la sous-classification UIButton et de remplacer layoutSubviews ?

Puis, en post-traitement, les emplacements de self.imageView & self.titleLabel

4 votes

C'est tellement plus facile que tous les autres conseils (comme celui ci-dessus) qui consistent à essayer de tout placer correctement en utilisant des inserts réglés à la main.

4voto

BFar Points 308

En s'appuyant sur la réponse de @split...

La réponse est fantastique, mais elle ignore le fait que le bouton peut avoir une image personnalisée et des inserts de bord de titre qui sont définis à l'avance (par exemple dans le storyboard).

Par exemple, il se peut que vous souhaitiez que l'image soit un peu plus large que le haut et le bas du conteneur, tout en la déplaçant vers le côté droit du bouton.

J'ai étendu le concept avec cette méthode :-

- (void) moveImageToRightSide {
    [self sizeToFit];

    CGFloat titleWidth = self.titleLabel.frame.size.width;
    CGFloat imageWidth = self.imageView.frame.size.width;
    CGFloat gapWidth = self.frame.size.width - titleWidth - imageWidth;
    self.titleEdgeInsets = UIEdgeInsetsMake(self.titleEdgeInsets.top,
                                            -imageWidth + self.titleEdgeInsets.left,
                                            self.titleEdgeInsets.bottom,
                                            imageWidth - self.titleEdgeInsets.right);

    self.imageEdgeInsets = UIEdgeInsetsMake(self.imageEdgeInsets.top,
                                            titleWidth + self.imageEdgeInsets.left + gapWidth,
                                            self.imageEdgeInsets.bottom,
                                            -titleWidth + self.imageEdgeInsets.right - gapWidth);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X