如何使用 Swift 以编程方式创建 UILabel?

Posted

技术标签:

【中文标题】如何使用 Swift 以编程方式创建 UILabel?【英文标题】:How to create UILabel programmatically using Swift? 【发布时间】:2014-07-27 17:13:56 【问题描述】:

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

我从 Xcode 6 中的一个新的“单一视图应用程序”开始,并为此项目选择了 Swift。我有我的文件 AppDelegate.swiftViewController.swift,但我不知道从这里做什么。

【问题讨论】:

我建议你从这里开始你的学习:Swift documentation 并按你的方式去Raywenderlich Tutorials 【参考方案1】:

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)

【讨论】:

【参考方案2】:

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

然后在viewDidLoad()中添加view

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,你能解释一下你的代码吗? [懒惰的 var myLabel: UILabel = () ]。这会很有帮助。谢谢.... @ios 当您将变量创建为lazy var variable_name = "" 时,它不会消耗您的内存,除非您的应用程序调用了该变量。如果不使用该属性,那么它将永远不会执行。 然后我们将在我们的项目中将所有变量创建为惰性,以获得更好的性能。我说的对吗? @iOS 是的!更好地在您的应用程序中使用该变量类型以获得更好的性能。此外,您还应该能够了解 Thread 以获得更好的性能。【参考方案3】:

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

【讨论】:

您不应该对标签框架进行硬编码 - 当文本更改或文本本地化并更改字符数时会发生什么? 您也可以查看这篇描述以编程方式添加 UITextField、UITextView 和 UILabel 的博客:webindream.com/how-to-change-ui-elements-programmatically @iSuresh 你怎么知道 CGPoint(x:160, y: 285) 将成为他们正在使用的模型的中心? 但是如何设置一个根据内容调整宽度的UILabel呢? @rommex 为此,请调用 label.sizeToFit()【参考方案4】:

您可以使用以下代码创建标签。已更新。

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 这样您就可以使用约束移动视图【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:
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 中试试上面的代码

【讨论】:

【参考方案10】:

另一种使用闭包的替代方法,使用 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() 中)都会导致标签不出现。【参考方案11】:

只是为了添加已经很好的答案,您可能希望在项目中添加多个标签,因此执行所有这些(设置大小、样式等)将很痛苦。为了解决这个问题,你可以创建一个单独的 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)
     



【讨论】:

正是我想要的! 谢谢你,我有一个问题,如果我想在一个类中将一个字符串传递给self.text 以像这样发起:myLabel = MyLabel(string: "text") 我只是了解如何使用您的课程并像这样调用:myLabel.text = "text"【参考方案12】:

这里是 Swift 3 的正确代码,带有用于指导目的的 cmets:

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 - 希望对您有所帮助

以上是关于如何使用 Swift 以编程方式创建 UILabel?的主要内容,如果未能解决你的问题,请参考以下文章

如何在swift中使用for循环以编程方式创建按钮

如何以编程方式创建 UIImage 视图 - Swift

如何以编程方式创建标签栏控制器后添加导航界面(Swift)

如何在 Swift 中以编程方式创建 SplitViewController?

如何以编程方式创建按钮?

如何在 ios swift 中以编程方式创建自动布局等宽约束?