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ć.
Oto poprawny kod dla Swift 3, z komentarzami w celach instruktażowych:
overridefunc 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)}
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.
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)extensionUILabel{func myLabel(){
textAlignment =.center
textColor =.white
backgroundColor =.lightGray
font =UIFont.systemFont(ofSize:17)
numberOfLines =0
lineBreakMode =.byCharWrapping
sizeToFit()}}
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
}()overridefunc viewDidLoad(){/** Add theLabel to the ViewControllers view */
view.addSubview(theLabel)}overridefunc 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ę.
overridefunc 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}
@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.
@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ść.
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)
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.