如何使用Swift编程创建UILabel?

133

我如何使用Swift在Xcode 6中以编程方式创建UILabel

我在Xcode 6中启动了一个新的“单视图应用程序”,并选择了Swift项目。 我有我的文件AppDelegate.swiftViewController.swift ,但我不确定下一步该怎么做。


1
我建议你从这里开始学习:Swift文档,然后逐步深入学习Raywenderlich教程 - Prashant
12个回答

278

在Swift 3+中以编程方式创建UILabel:

override func viewDidLoad() {
    super.viewDidLoad()

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

9
不应硬编码标签框架——如果文本更改或本地化导致字符数量发生变化,会发生什么? - Zorayr
您还可以查看这篇博客,其中描述了如何以编程方式添加UITextField、UITextView和UILabel: http://webindream.com/how-to-change-ui-elements-programmatically/ - farhad rubel
@iSuresh 你怎么知道 CGPoint(x:160, y: 285) 是他们使用的模型的中心点? - Dave G
但是如何设置一个UILabel,使其根据内容调整宽度? - rommex
4
要实现这一点,请调用 **label.sizeToFit()**。 - Joshua Wolff
Swift5.1 var label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 21)) label.center = CGPoint(x: 160, y: 284) label.textAlignment = NSTextAlignment.center label.text = "我是一个测试标签" self.view.addSubview(label) - uplearned.com

28

这里是适用于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)
}

谢谢Gourav - 希望有所帮助。 - Gene Loparco

17

除了之前已经给出的好答案之外,你可能希望在项目中添加多个标签,这样做(设置大小、样式等)会很麻烦。为了解决这个问题,你可以创建一个单独的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") - Daniel Beltrami
我刚刚发现了如何使用您的类并像这样调用:myLabel.text =“文本” - Daniel Beltrami

16

viewDidLoad方法之外创建一个UILabel视图,然后在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
}

@我喜欢编程,你能否解释一下你的代码[lazy var myLabel: UILabel = { }()]。这将非常有帮助。谢谢。 - Naresh
1
@iOS 当你将变量定义为 lazy var variable_name = "" 时,它不会占用内存,除非该变量被应用程序调用。如果该属性未被使用,则永远不会执行。 - I Love Coding
那么我们将在项目中将所有变量都设置为延迟加载以获得更好的性能。我说得对吗? - Naresh
@iOS 没错!在你的应用中使用这种变量类型可以获得更好的性能。此外,为了获得更好的性能,你还应该熟悉线程。 - I Love Coding

16

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

11
你可以使用以下代码创建标签。已更新。
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)

我会添加 yourLabel.translatesAutoresizingMaskIntoConstraints = false,这样你就可以使用约束移动你的视图。 - craft

9

在Swift 3中的另一个答案:

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)

6

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

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

作为注意事项,使用VC中的函数时,theLabel的属性仍然可以更改。你只需要在闭包内设置各种默认值,并最小化像viewDidLoad()这样的函数中的混乱即可。

高超的技巧......但在Xcode 9.4.1中对我不起作用,除非我在计算值中的某个地方指定框架,无论是在构造函数(UILabel(frame:))中还是在块的其他位置(label.frame=)。任何稍后设置框架的操作(例如在viewDidLayoutSubviews()中)都会导致标签不出现。 - Glenn

3

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接