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ć.


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)

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

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


}

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

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)

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)

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


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
}

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

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

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


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
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.