42 votes

Définir de manière programmatique l'image et le texte d'un UIButton

J'ai besoin de créer un bouton de façon programmatique avec une image pour l'état normal et l'état surligné ainsi que du texte. Je ne peux pas le créer à l'aide d'Interface Builder, car je dois créer des boutons sur un fichier de type UIScrollView . Voici le code que j'ai jusqu'à présent :

- (void)loadView {
    CGRect fullScreenRect=[[UIScreen mainScreen] applicationFrame];
    scrollView=[[UIScrollView alloc] initWithFrame:fullScreenRect];
    scrollView.contentSize=CGSizeMake(320,960);

    UIImageView *tempImageView2 = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image.jpeg"]];

    UIImage * buttonImage = [UIImage imageNamed:@"contentlist_active.png"];

    self.view=scrollView;
    [scrollView addSubview:tempImageView2];

    btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.frame = CGRectMake(22, 100, 277, 32);

    [btn setImage:buttonImage forState:UIControlStateNormal]; 

    [btn setTitle:@"hello world" forState:UIControlStateNormal];
    [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

    [scrollView addSubview:btn];

}

Mais le texte du bouton ne s'affiche pas. Si je mets en commentaire l'élément setImage pour button alors le texte s'affiche parfaitement, sinon non. Puis-je avoir du texte et une image en même temps ?

0 votes

Pouvez-vous me dire comment aligner le texte, à gauche ou à droite, si je dois placer du texte arabe par exemple.

80voto

iPrabu Points 7216

UIButtons setImage définit l'image au-dessus du titre de sorte que vous ne pourrez pas voir le texte en dessous. Essayez donc de définir l'image de votre bouton avec setBackgroundImage.

Objective-C :

[btn setBackgroundImage:buttonImage forState:UIControlStateNormal]; 

Swift :

myButton.setBackgroundImage(buttonImage, forState: .normal)

0 votes

Pouvez-vous me dire comment aligner le texte, à gauche ou à droite, si je dois placer du texte arabe par exemple.

1 votes

[yourButton.titleLabel setTextAlignment:UITextAlignmentLeft] ;

0 votes

Mes images ne s'insèrent toujours pas dans le bouton si je lance l'application sur l'iPad air 2 parce qu'elles ont une faible résolution.

24voto

Saroj Kumar ojha Points 195

Vous avez fait une erreur, vous faites

[btn setBackgroundImage:buttonImage forState:UIControlStateNormal]; 

au lieu de

[btn setImage:buttonImage forState:UIControlStateNormal]; 

Cela fonctionnera très bien.

4voto

Rana Anees Points 85

Avez-vous essayé

[btn setBackgroundImage:buttonImage forState:UIControlStateHighlighted];

Cela pourrait résoudre votre problème.

4voto

Swift 4

  • Vous pouvez définir l'image et le texte ensemble comme un texte d'attribut et vous pouvez le faire en mettant en œuvre le code ci-dessous :
  • ici j'ai personnalisé la fonction dans laquelle vous pouvez passer le chaîne du titre y image du bouton il vous renverra un texte attribué et vous pourrez définir le titre de UIButton/UILabel comme un titre/texte attribué.

- si vous voulez afficher un préfixe d'image avec un titre

func AttributedTextwithImagePrefix(AttributeImage : UIImage , AttributedText : String , buttonBound : UIButton) -> NSMutableAttributedString
{
    let fullString = NSMutableAttributedString(string: "   ")
    let image1Attachment = NSTextAttachment()
    image1Attachment.bounds = CGRect(x: 0, y: ((buttonBound.titleLabel?.font.capHeight)! - AttributeImage.size.height).rounded() / 2, width: AttributeImage.size.width, height: AttributeImage.size.height)
    image1Attachment.image = AttributeImage
    let image1String = NSAttributedString(attachment: image1Attachment)
    fullString.append(image1String)
    fullString.append(NSAttributedString(string: "  " + AttributedText))
    return fullString
}

Voici comment vous pouvez l'utiliser :

self.btnprefix.setAttributedTitle(AttributedTextwithImagePrefix(AttributeImage: #imageLiteral(resourceName: "avtar"), AttributedText: " prefix avtar", buttonBound: self.prefix), for: .normal)

- si vous voulez afficher un suffixe d'image avec un titre

func AttributedTextwithImageSuffix(AttributeImage : UIImage , AttributedText : String , buttonBound : UIButton) -> NSMutableAttributedString
{
    let fullString = NSMutableAttributedString(string: AttributedText + "  ")
    let image1Attachment = NSTextAttachment()
    image1Attachment.bounds = CGRect(x: 0, y: ((buttonBound.titleLabel?.font.capHeight)! - AttributeImage.size.height).rounded() / 2, width: AttributeImage.size.width, height: AttributeImage.size.height)
    image1Attachment.image = AttributeImage
    let image1String = NSAttributedString(attachment: image1Attachment)
    fullString.append(image1String)
    fullString.append(NSAttributedString(string: ""))
    return fullString
}

Voici comment vous pouvez l'utiliser :

self.btnsuffix.setAttributedTitle(AttributedTextwithImageSuffix(AttributeImage: #imageLiteral(resourceName: "avtar"), AttributedText: " suffix avtar", buttonBound: self.btnsuffix), for: .normal)

LA SORTIE SERA

enter image description here

2voto

Je pense que la réponse d'Azharhussain Shaikh ne fonctionne pas avec des images plus grandes. J'ai donc modifié un peu la réponse et l'ai convertie en un fichier Extension de Swift 4 à UIButton . Et voilà :

extension UIButton {
func setAttributedTextWithImagePrefix(image: UIImage, text: String, for state: UIControl.State) {
    let fullString = NSMutableAttributedString()

    if let imageString = getImageAttributedString(image: image) {
        fullString.append(imageString)
    }

    fullString.append(NSAttributedString(string: "  " + text))

    self.setAttributedTitle(fullString, for: state)
}

func setAttributedTextWithImageSuffix(image: UIImage, text: String, for state: UIControl.State) {
    let fullString = NSMutableAttributedString(string: text + "  ")

    if let imageString = getImageAttributedString(image: image) {
        fullString.append(imageString)
    }

    self.setAttributedTitle(fullString, for: state)
}

fileprivate func getImageAttributedString(image: UIImage) -> NSAttributedString? {
    let buttonHeight = self.frame.height

    if let resizedImage = image.getResizedWithAspect(maxHeight: buttonHeight - 10) {
        let imageAttachment = NSTextAttachment()
        imageAttachment.bounds = CGRect(x: 0, y: ((self.titleLabel?.font.capHeight)! - resizedImage.size.height).rounded() / 2, width: resizedImage.size.width, height: resizedImage.size.height)
        imageAttachment.image = resizedImage
        let image1String = NSAttributedString(attachment: imageAttachment)
        return image1String
    }

    return nil
}
}

et une extension à UIImage :

extension UIImage {

func getResized(size: CGSize) -> UIImage? {
    if UIScreen.main.responds(to: #selector(NSDecimalNumberBehaviors.scale)) {
        UIGraphicsBeginImageContextWithOptions(size, false, UIScreen.main.scale);
    } else {
        UIGraphicsBeginImageContext(size);
    }

    self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height));
    let newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return newImage;
}

func getResizedWithAspect(scaledToMaxWidth width: CGFloat? = nil, maxHeight height: CGFloat? = nil) -> UIImage? {
    let oldWidth = self.size.width;
    let oldHeight = self.size.height;

    var scaleToWidth = oldWidth
    if let width = width {
        scaleToWidth = width
    }

    var scaleToHeight = oldHeight
    if let height = height {
        scaleToHeight = height
    }

    let scaleFactor = (oldWidth > oldHeight) ? scaleToWidth / oldWidth : scaleToHeight / oldHeight;

    let newHeight = oldHeight * scaleFactor;
    let newWidth = oldWidth * scaleFactor;
    let newSize = CGSize(width: newWidth, height: newHeight);

    return getResized(size: newSize);
}
}

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