Como criar UILabel programaticamente usando Swift?

115

Como faço para criar um UILabelprogramaticamente usando Swift no Xcode 6?

Comecei com um novo "Single View Application" no Xcode 6 e selecionei o Swift para este projeto. Tenho meus arquivos AppDelegate.swifte ViewController.swiftnão tenho certeza do que fazer a partir daqui.

Akhtar
fonte
1
Eu sugiro que você comece seu estudo aqui: Documentação do Swift e
Prashant

Respostas:

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)
}  

Atualização do 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
fonte
2
Você não precisa declarar isso implicitamente como UILabel, é inferido de UILabel ()
CW0007007
5
Você não deve codificar o quadro de rótulos - o que acontece quando o texto muda ou o texto é localizado e altera o número de caracteres?
Zorayr
Você também pode verificar este blog que descreve a adição programática de UITextField, UITextView e UILabel: webindream.com/how-to-change-ui-elements-programmatically
farhad rubel
@iSuresh como você sabe que CGPoint (x: 160, y: 285) será o centro para o modelo que eles estão usando?
Dave G
2
@rommex Para fazer isso, chame label.sizeToFit () .
Josh Wolff
27

Aqui está o código correto para Swift 3, com comentários para fins de instrução:

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
fonte
Obrigado Gourav - espero que tenha ajudado
Gene Loparco
14

Apenas para adicionar às já ótimas respostas, você pode querer adicionar vários rótulos em seu projeto, então fazer tudo isso (definir tamanho, estilo, etc.) será uma dor. Para resolver isso, você pode criar uma classe UILabel separada.

  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

    }

}

Para usá-lo, faça o seguinte

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)
     }


}
Cirilo
fonte
É mesmo o que eu procurava!
madprogramer
Obrigado cara, eu tenho uma pergunta, se eu quero passar um string para self.textdentro de uma classe para iniciar assim:myLabel = MyLabel(string: "text")
Daniel Beltrami
Acabei de descobrir como, usando sua aula e chamando assim:myLabel.text = "text"
Daniel Beltrami
11

Swift 4.X e 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)

Se você tiver vários rótulos em sua classe, use a extensão para adicionar propriedades.

//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
fonte
8

Você pode criar uma etiqueta usando o código abaixo. Atualizada.

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
fonte
5

Outro código 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
fonte
5

Uma alternativa usando um encerramento para separar o código em algo um pouco mais limpo usando o 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)
    }
}

Como uma nota, os atributos para theLabelainda podem ser alterados sempre que usar funções no VC. Você está apenas definindo vários padrões dentro do fechamento e minimizando a desordem em funções comoviewDidLoad()

Archdoog
fonte
Bela técnica ... mas não está funcionando para mim no Xcode 9.4.1 ... a menos que eu especifique o quadro em algum lugar do valor calculado, seja no construtor ( UILabel(frame:)) ou em outro lugar no bloco ( label.frame=). Qualquer configuração posterior do quadro (por exemplo, dentro viewDidLayoutSubviews()) fazia com que o rótulo não aparecesse.
Glenn
5

Crie uma UILabelvisão fora da viewDidLoadclasse e, em seguida, adicione essa visão à sua visão principal no viewDidLoadmétodo.

lazy var myLabel: UILabel = {


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

E então adicione isso viewemviewDidLoad()

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
}
Eu amo codificar
fonte
@I Love Coding, você pode explicar sobre o seu código. [lazy var myLabel: UILabel = {} ()]. Isso vai ajudar muito. Obrigado ....
iOS
1
@iOS Quando você cria uma variável, pois lazy var variable_name = ""ela não consumirá sua memória a menos que essa variável seja chamada por seu aplicativo. Se essa propriedade não for usada, ela nunca será executada.
I Love Coding
Então vamos criar todas as variáveis ​​como preguiçosas em nosso projeto para um melhor desempenho. Estou certo?
iOS
@iOS sim! É melhor usar esse tipo de variável em seu aplicativo para melhor desempenho. Além disso, você deve estar ciente do Thread para melhor desempenho.
I Love Coding de
3

Crie uma etiqueta em 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
fonte
1

Swift 4.2 e Xcode 10. Em algum lugar no 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
}()

...

Usando:

debugInfoLabel.text = debugInfo
Olga Grineva
fonte
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)

Experimente o código acima em ViewDidLoad


fonte
0

Swift 4.2 e Xcode 10 Inicializam a etiqueta antes de viewDidLoad.

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

Em viewDidLoad, adicione rótulo à visualização e aplique restrições.

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
fonte