Comment créer UILabel par programmation en utilisant Swift?

115

Comment créer un UILabelprogramme à l'aide de Swift dans Xcode 6?

J'ai commencé avec une nouvelle "Application Single View" dans Xcode 6 et j'ai sélectionné Swift pour ce projet. J'ai mes fichiers AppDelegate.swiftet ViewController.swiftje ne sais pas quoi faire à partir d'ici.

Akhtar
la source
1
Je vous suggère de commencer votre étude ici: Documentation Swift et de vous rendre aux Tutoriels Raywenderlich
Prashant

Réponses:

252
override func viewDidLoad()
{
  super.viewDidLoad()
  var label = UILabel(frame: CGRectMake(0, 0, 200, 21))
  label.center = CGPointMake(160, 284)
  label.textAlignment = NSTextAlignment.Center
  label.text = "I'm a test label"
  self.view.addSubview(label)
}  

Mise à jour Swift 3.0+:

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
label.center = CGPoint(x: 160, y: 285)
label.textAlignment = .center
label.text = "I'm a test label"
self.view.addSubview(label)
iSuresh
la source
2
Vous n'avez pas besoin de le déclarer implicitement comme UILabel, il est déduit de UILabel ()
CW0007007
5
Vous ne devriez pas coder en dur le cadre des étiquettes - que se passe-t-il lorsque le texte change ou que le texte est localisé et change le nombre de caractères?
Zorayr
Vous pouvez également consulter ce blog qui décrit l'ajout par programme de UITextField, UITextView et UILabel: webindream.com/how-to-change-ui-elements-programmatically
farhad rubel
@iSuresh comment savez-vous que CGPoint (x: 160, y: 285) sera au centre du modèle qu'ils utilisent?
Dave G
2
@rommex Pour ce faire, appelez label.sizeToFit () .
Josh Wolff
27

Voici le code correct pour Swift 3, avec des commentaires à des fins pédagogiques:

override func viewDidLoad()
{
    super.viewDidLoad()

    // CGRectMake has been deprecated - and should be let, not var
    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))

    // you will probably want to set the font (remember to use Dynamic Type!)
    label.font = UIFont.preferredFont(forTextStyle: .footnote)

    // and set the text color too - remember good contrast
    label.textColor = .black

    // may not be necessary (e.g., if the width & height match the superview)
    // if you do need to center, CGPointMake has been deprecated, so use this
    label.center = CGPoint(x: 160, y: 284)

    // this changed in Swift 3 (much better, no?)
    label.textAlignment = .center

    label.text = "I am a test label"

    self.view.addSubview(label)
}
Gene Loparco
la source
Merci Gourav - espérons que cela a aidé
Gene Loparco
14

Juste pour ajouter aux réponses déjà excellentes, vous voudrez peut-être ajouter plusieurs étiquettes dans votre projet, donc faire tout cela (réglage de la taille, du style, etc.) sera pénible. Pour résoudre ce problème, vous pouvez créer une classe UILabel distincte.

  import UIKit

  class MyLabel: UILabel {

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

    override init(frame: CGRect) {
        super.init(frame: frame)
        initializeLabel()
    }

    func initializeLabel() {

        self.textAlignment = .left
        self.font = UIFont(name: "Halvetica", size: 17)
        self.textColor = UIColor.white

    }

}

Pour l'utiliser, procédez comme suit

import UIKit

class ViewController: UIViewController {

     var myLabel: MyLabel()

     override func viewDidLoad() {
          super.viewDidLoad()

          myLabel = MyLabel(frame: CGRect(x: self.view.frame.size.width / 2, y: self.view.frame.size.height / 2, width: 100, height: 20))
          self.view.addSubView(myLabel)
     }


}
Cyril
la source
Exactement ce que je cherchais!
madprogramer
Merci mec, j'ai une question, si je veux passer une chaîne à l' self.textintérieur d'une classe pour initier comme ceci:myLabel = MyLabel(string: "text")
Daniel Beltrami
Je viens de découvrir comment, en utilisant votre classe et en appelant comme ceci:myLabel.text = "text"
Daniel Beltrami
11

Swift 4.X et Xcode 10

let lbl = UILabel(frame: CGRect(x: 10, y: 50, width: 230, height: 21))
lbl.textAlignment = .center //For center alignment
lbl.text = "This is my label fdsjhfg sjdg dfgdfgdfjgdjfhg jdfjgdfgdf end..."
lbl.textColor = .white
lbl.backgroundColor = .lightGray//If required
lbl.font = UIFont.systemFont(ofSize: 17)

//To display multiple lines in label
lbl.numberOfLines = 0 //If you want to display only 2 lines replace 0(Zero) with 2.
lbl.lineBreakMode = .byWordWrapping //Word Wrap
// OR
lbl.lineBreakMode = .byCharWrapping //Charactor Wrap

lbl.sizeToFit()//If required
yourView.addSubview(lbl)

Si vous avez plusieurs étiquettes dans votre classe, utilisez l'extension pour ajouter des propriétés.

//Label 1
let lbl1 = UILabel(frame: CGRect(x: 10, y: 50, width: 230, height: 21))
lbl1.text = "This is my label fdsjhfg sjdg dfgdfgdfjgdjfhg jdfjgdfgdf end..."
lbl1.myLabel()//Call this function from extension to all your labels
view.addSubview(lbl1)

//Label 2
let lbl2 = UILabel(frame: CGRect(x: 10, y: 150, width: 230, height: 21))
lbl2.text = "This is my label fdsjhfg sjdg dfgdfgdfjgdjfhg jdfjgdfgdf end..."
lbl2.myLabel()//Call this function from extension to all your labels
view.addSubview(lbl2)

extension UILabel {
    func myLabel() {
        textAlignment = .center
        textColor = .white
        backgroundColor = .lightGray
        font = UIFont.systemFont(ofSize: 17)
        numberOfLines = 0
        lineBreakMode = .byCharWrapping
        sizeToFit()
    }
}
iOS
la source
8

Vous pouvez créer une étiquette en utilisant le code ci-dessous. Actualisé.

let yourLabel: UILabel = UILabel()
yourLabel.frame = CGRect(x: 50, y: 150, width: 200, height: 21)
yourLabel.backgroundColor = UIColor.orange
yourLabel.textColor = UIColor.black
yourLabel.textAlignment = NSTextAlignment.center
yourLabel.text = "test label"
self.view.addSubview(yourLabel)
Tushar Korde
la source
5

Un autre code swift3

let myLabel = UILabel()
    myLabel.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
    myLabel.center = CGPoint(x: 0, y: 0)
    myLabel.textAlignment = .center
    myLabel.text = "myLabel!!!!!"
    self.view.addSubview(myLabel)
Ryosuke Hujisawa
la source
5

Une alternative utilisant une fermeture pour séparer le code en quelque chose d'un peu plus soigné en utilisant Swift 4:

class theViewController: UIViewController {

    /** Create the UILabel */
    var theLabel: UILabel = {
        let label = UILabel()
        label.lineBreakMode = .byWordWrapping
        label.textColor = UIColor.white
        label.textAlignment = .left
        label.numberOfLines = 3
        label.font = UIFont(name: "Helvetica-Bold", size: 22)
        return label
    }()

    override func viewDidLoad() {
        /** Add theLabel to the ViewControllers view */
        view.addSubview(theLabel)
    }

    override func viewDidLayoutSubviews() {
        /* Set the frame when the layout is changed */
        theLabel.frame = CGRect(x: 0,
                                y: 0,
                                width: view.frame.width - 30,
                                height: 24)
    }
}

À noter, les attributs de theLabelpeuvent toujours être modifiés à chaque utilisation de fonctions dans le VC. Vous définissez simplement divers paramètres par défaut à l'intérieur de la fermeture et minimisez l'encombrement dans des fonctions telles queviewDidLoad()

Archdoog
la source
Belle technique ... mais cela ne fonctionne pas pour moi dans Xcode 9.4.1 ... sauf si je spécifie le cadre quelque part dans la valeur calculée, que ce soit dans le constructeur ( UILabel(frame:)) ou ailleurs dans le bloc ( label.frame=). Tout réglage ultérieur du cadre (par exemple, dans viewDidLayoutSubviews()) empêchait l'étiquette d'apparaître.
Glenn
5

Créez une UILabelvue en dehors de la viewDidLoadclasse, puis ajoutez cette vue à votre vue principale dans viewDidLoadmethod.

lazy var myLabel: UILabel = {


    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = "This is label view."
    label.font = UIFont.systemFont(ofSize: 12)
    return label
}()

Et puis ajoutez cela viewdansviewDidLoad()

override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(myLabel)

    // Set its constraint to display it on screen
    myLabel.widthAnchor.constraint(equalToConstant:  200).isActive = true
    myLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    myLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
J'adore le codage
la source
@ J'aime le codage, pouvez-vous s'il vous plaît expliquer votre code. [lazy var myLabel: UILabel = {} ()]. Cela sera très utile. Merci ....
iOS
1
@iOS Lorsque vous créez une variable car lazy var variable_name = ""elle ne consommera pas votre mémoire à moins que cette variable ne soit appelée par votre application. Si cette propriété n'est pas utilisée, elle ne s'exécutera jamais.
J'aime coder
Ensuite, nous créerons toutes les variables comme paresseuses dans notre projet pour de meilleures performances. Ai-je raison?
iOS
@iOS ouais! Mieux vaut utiliser ce type de variable dans votre application pour de meilleures performances. En outre, vous devez également être en mesure de connaître Thread pour de meilleures performances.
J'aime coder
3

Créer une étiquette dans Swift 4

 let label = UILabel(frame: CGRect(x: self.view.frame.origin.x, y: self.view.frame.origin.y, width: self.view.frame.size.width, height: 50))
    label.textAlignment = .center
    label.text = "Hello this my label"

    //To set the color
    label.backgroundColor = UIColor.white
    label.textColor = UIColor.black

    //To set the font Dynamic
    label.font = UIFont(name: "Helvetica-Regular", size: 20.0)

    //To set the system font
    label.font = UIFont.systemFont(ofSize: 20.0)

    //To display multiple lines
    label.numberOfLines = 0
    label.lineBreakMode = .byWordWrapping //Wrap the word of label
    label.lineBreakMode = .byCharWrapping //Wrap the charactor of label

    label.sizeToFit()
    self.view.addSubview(label)
Bhavisha Khatri
la source
1

Swift 4.2 et Xcode 10. Quelque part dans ViewController:

private lazy var debugInfoLabel: UILabel = {
    let label = UILabel()
    label.textColor = .white
    label.translatesAutoresizingMaskIntoConstraints = false
    yourView.addSubview(label)
    NSLayoutConstraint.activate([
        label.centerXAnchor.constraint(equalTo: suggestionView.centerXAnchor),
        label.centerYAnchor.constraint(equalTo: suggestionView.centerYAnchor, constant: -100),
        label.widthAnchor.constraint(equalToConstant: 120),
        label.heightAnchor.constraint(equalToConstant: 50)])
    return label
}()

...

En utilisant:

debugInfoLabel.text = debugInfo
Olga Grineva
la source
0
let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21))
label.center = CGPoint(x: 160, y: 285)
label.textAlignment = .center
label.text = "My label"
self.view.addSubview(label)

Essayez le code ci-dessus dans ViewDidLoad


la source
0

Swift 4.2 et Xcode 10 Initialisent l'étiquette avant viewDidLoad.

lazy var topLeftLabel: UILabel = {
    let label = UILabel()
    label.translatesAutoresizingMaskIntoConstraints = false
    label.text = "TopLeft"
    return label
}()

Dans viewDidLoad, ajoutez une étiquette à la vue et appliquez des contraintes.

override func viewDidLoad() {
    super.viewDidLoad()
    view.addSubview(topLeftLabel)
    topLeftLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 10).isActive = true
    topLeftLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 10).isActive = true
}
Sudhi 9135
la source