Jak programowo stworzyć UILabel przy użyciu Swift?

115

Jak utworzyć UILabelprogramistycznie przy użyciu Swift w Xcode 6?

Zacząłem od nowej „aplikacji pojedynczego widoku” w Xcode 6 i wybrałem Swift dla tego projektu. Mam swoje pliki AppDelegate.swifti ViewController.swiftnie wiem, co mam teraz zrobić.

Akhtar
źródło
1
Proponuję rozpocząć naukę tutaj: Szybka dokumentacja i przejdź do samouczków Raywenderlich
Prashant.

Odpowiedzi:

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

Aktualizacja 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
źródło
2
Nie musisz domyślnie deklarować tego jako UILabel, jest to wywnioskowane z UILabel ()
CW0007007
5
Nie należy na stałe kodować ramki etykiet - co się stanie, gdy tekst się zmieni lub tekst zostanie zlokalizowany i zmieni się liczba znaków?
Zorayr
Możesz również sprawdzić tego bloga, który opisuje programowe dodawanie UITextField, UITextView i UILabel: webindream.com/how-to-change-ui-elements-programmatically
farhad rubel
@iSuresh skąd wiesz, że CGPoint (x: 160, y: 285) będzie w centrum modelu, którego używają?
Dave G
2
@rommex Aby to zrobić, wywołaj label.sizeToFit () .
Josh Wolff
27

Oto poprawny kod dla Swift 3, z komentarzami w celach instruktażowych:

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
źródło
Dzięki Gourav - mam nadzieję, że pomogło
Gene Loparco
14

Aby dodać do już świetnych odpowiedzi, możesz chcieć dodać wiele etykiet do swojego projektu, więc zrobienie tego wszystkiego (ustawienie rozmiaru, stylu itp.) Będzie uciążliwe. Aby rozwiązać ten problem, możesz utworzyć oddzielną klasę UILabel.

  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

    }

}

Aby go użyć, wykonaj następujące czynności

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


}
Cyryla
źródło
Właśnie tego szukałem!
madprogramer
Dziękuję człowieku, mam pytanie, czy chcę przekazać ciąg do self.textwewnątrz klasy, aby zainicjować w ten sposób:myLabel = MyLabel(string: "text")
Daniel Beltrami
Po prostu dowiaduję się, jak, korzystając z twojej klasy i dzwoniąc w ten sposób:myLabel.text = "text"
Daniel Beltrami
11

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

Jeśli masz wiele etykiet w swojej klasie, użyj rozszerzenia, aby dodać właściwości.

//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
źródło
8

Możesz utworzyć etykietę, korzystając z poniższego kodu. Zaktualizowano.

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
źródło
5

Kolejny kod 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
źródło
5

Alternatywa wykorzystująca zamknięcie do rozdzielenia kodu na coś bardziej estetycznego za pomocą języka 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)
    }
}

Uwaga: atrybuty for theLabelmożna nadal zmieniać za każdym razem, gdy używasz funkcji w VC. Po prostu ustawiasz różne ustawienia domyślne wewnątrz zamknięcia i minimalizujesz bałagan w funkcjach takich jakviewDidLoad()

Archdoog
źródło
Piękna technika ... ale nie działa dla mnie w Xcode 9.4.1 ... chyba że podam ramkę gdzieś w obliczanej wartości, czy to w konstruktorze ( UILabel(frame:)), czy w innym miejscu w bloku ( label.frame=). Jakiekolwiek późniejsze ustawienie ramki (np. viewDidLayoutSubviews()In) powodowało, że etykieta nie pojawiała się.
Glenn,
5

Utwórz UILabelwidok poza viewDidLoadklasą, a następnie dodaj ten widok do głównego widoku w viewDidLoadmetodzie.

lazy var myLabel: UILabel = {


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

A następnie dodać, że viewwviewDidLoad()

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
}
Kocham kodowanie
źródło
@ I Love Coding, czy możesz wyjaśnić swój kod. [leniwy var myLabel: UILabel = {} ()]. Będzie to bardzo pomocne. Dziękuję ...
iOS
1
@iOS Podczas tworzenia zmiennej, ponieważ lazy var variable_name = ""nie będzie ona zużywać pamięci, chyba że ta zmienna zostanie wywołana przez aplikację. Jeśli ta właściwość nie jest używana, nigdy nie zostanie wykonana.
Uwielbiam kodowanie
Następnie utworzymy wszystkie zmienne jako leniwe w naszym projekcie, aby uzyskać lepszą wydajność. Czy mam rację?
iOS
@iOS yeah! Lepiej użyj tego typu zmiennej w swojej aplikacji, aby uzyskać lepszą wydajność. Ponadto powinieneś być w stanie rozpoznać wątek, aby uzyskać lepszą wydajność.
Uwielbiam kodowanie
3

Stwórz etykietę w 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
źródło
1

Swift 4.2 i Xcode 10. Gdzieś w 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
}()

...

Za pomocą:

debugInfoLabel.text = debugInfo
Olga Grineva
źródło
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)

Wypróbuj powyższy kod w ViewDidLoad


źródło
0

Swift 4.2 i Xcode 10 Inicjalizuj etykietę przed viewDidLoad.

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

W viewDidLoad dodaj etykietę do widoku i zastosuj ograniczenia.

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
źródło