如何使用 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.swift
和 ViewController.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?的主要内容,如果未能解决你的问题,请参考以下文章