Як створити UILabel програмно за допомогою Swift?


115

Як створити UILabelпрограмно за допомогою Swift в Xcode 6?

Я почав з нової програми "Single View" в Xcode 6 і вибрав Swift для цього проекту. У мене є свої файли, AppDelegate.swiftі ViewController.swiftя не впевнений, що звідси робити.


1
Я пропоную розпочати своє навчання тут: Швидка документація та відпрацюйте дорогу до Підручників Райвендерліха
Прашант

Відповіді:


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

Оновлення 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
Вам не потрібно неявно заявляти це як UILabel, це зроблено з UILabel ()
CW0007007

5
Вам не слід жорстко кодувати рамку міток - що відбувається, коли текст змінюється або текст стає локалізованим і змінюється кількість символів?
Зорайр

Ви також можете перевірити цей блог, де описано програмне додавання UITextField, UITextView та UILabel: webindream.com/how-to-change-ui-elements-programmatic
farhad

@iSuresh як ти знаєш, що CGPoint (x: 160, y: 285) буде центром моделі, яку вони використовують?
Дейв Г

2
@rommex Для цього зателефонуйте label.sizeToFit () .
Джош Волф

27

Ось правильний код Swift 3 з коментарями для навчальних цілей:

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

Дякую Гурав - сподіваюсь, що це допомогло
Джин Лопарко

14

Просто для того, щоб додати до вже чудових відповідей, ви можете додати кілька міток у проекті, тому все це (встановлення розміру, стилю тощо) буде болем. Для вирішення цього питання можна створити окремий клас 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

    }

}

Щоб скористатися ним, виконайте наступне

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


}

Тільки те, що я шукав!
madprogramer

Дякую, чоловіче, у мене питання, чи хочу я передати рядок self.textвсередині класу, щоб почати так:myLabel = MyLabel(string: "text")
Даніель Белтрамі

Я просто myLabel.text = "text"
Даніель Белтрамі

11

Швидкий 4.X і 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)

Якщо у вашому класі є кілька міток, для додавання властивостей використовуйте розширення.

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

Ви можете створити мітку, використовуючи наведений нижче код. Оновлено.

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

Ще один код 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

Альтернатива за допомогою закриття для розділення коду на щось трохи акуратніше за допомогою 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)
    }
}

Як зауваження, атрибути для theLabelдосі можуть бути змінені щоразу, коли використовуються функції в VC. Ви просто встановлюєте різні параметри за замовчуванням всередині замикання і мінімізуєте захаращення таких функційviewDidLoad()


Прекрасна техніка ... але вона не працює для мене в Xcode 9.4.1 ... якщо я не вказав кадр десь у обчисленому значенні, будь то в конструкторі ( UILabel(frame:)) або в іншому місці в блоці ( label.frame=). Будь-яке пізніше встановлення кадру (наприклад, в viewDidLayoutSubviews()) спричинило появу мітки.
Гленн

5

Створіть UILabelперегляд поза viewDidLoadкласом, а потім додайте його в основний вигляд у viewDidLoadметоді.

lazy var myLabel: UILabel = {


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

А потім додайте це viewвviewDidLoad()

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, чи можете ви поясніть свій код. [lazy var myLabel: UILabel = {} ()]. Це дуже допоможе. Дякую ....
iOS

1
@iOS Коли ви створюєте змінну, lazy var variable_name = ""вона не буде споживати вашу пам'ять, якщо ваша зміна не викликає цю змінну. Якщо ця властивість не використовується, вона ніколи не буде виконана.
Я люблю кодування

Тоді ми створимо всі змінні як ледачі в нашому проекті для кращої роботи. Маю рацію?
iOS

@iOS так! Краще використовувати цей тип змінної у вашому додатку для кращої продуктивності. Крім того, ви повинні бути в курсі теми, щоб покращити продуктивність.
Я люблю кодування

3

Створіть ярлик швидко

 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 та Xcode 10. Десь у 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
}()

...

Використання:

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)

Спробуйте вищевказаний код у ViewDidLoad


0

Swift 4.2 та Xcode 10 Ініціалізуйте мітку перед viewDidLoad.

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

У viewDidLoad додайте мітку до перегляду та застосуйте обмеження.

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
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.