在 Swift 中以编程方式创建 UIButton

我正在尝试用 Swift 以编程方式构建 UI。

我怎样才能让这个动作起作用?

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let myFirstLabel = UILabel()
let myFirstButton = UIButton()
myFirstLabel.text = "I made a label on the screen #toogood4you"
myFirstLabel.font = UIFont(name: "MarkerFelt-Thin", size: 45)
myFirstLabel.textColor = UIColor.redColor()
myFirstLabel.textAlignment = .Center
myFirstLabel.numberOfLines = 5
myFirstLabel.frame = CGRectMake(15, 54, 300, 500)
myFirstButton.setTitle("✸", forState: .Normal)
myFirstButton.setTitleColor(UIColor.blueColor(), forState: .Normal)
myFirstButton.frame = CGRectMake(15, -50, 300, 500)
myFirstButton.addTarget(self, action: "pressed", forControlEvents: .TouchUpInside)
self.view.addSubview(myFirstLabel)
self.view.addSubview(myFirstButton)
}


func pressed(sender: UIButton!) {
var alertView = UIAlertView();
alertView.addButtonWithTitle("Ok");
alertView.title = "title";
alertView.message = "message";
alertView.show();
}
347331 次浏览

您只是遗漏了选择器名称末尾的冒号。因为 press 接受一个参数,所以冒号必须在那里。另外,按下的函数不应该嵌套在 viewDidLoad 中。

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let myFirstLabel = UILabel()
let myFirstButton = UIButton()
myFirstLabel.text = "I made a label on the screen #toogood4you"
myFirstLabel.font = UIFont(name: "MarkerFelt-Thin", size: 45)
myFirstLabel.textColor = .red
myFirstLabel.textAlignment = .center
myFirstLabel.numberOfLines = 5
myFirstLabel.frame = CGRect(x: 15, y: 54, width: 300, height: 500)
myFirstButton.setTitle("✸", for: .normal)
myFirstButton.setTitleColor(.blue, for: .normal)
myFirstButton.frame = CGRect(x: 15, y: -50, width: 300, height: 500)
myFirstButton.addTarget(self, action: #selector(pressed), for: .touchUpInside)
}


@objc func pressed() {
var alertView = UIAlertView()
alertView.addButtonWithTitle("Ok")
alertView.title = "title"
alertView.message = "message"
alertView.show()
}

编辑: 更新以反映 Swift 2.2中的最佳实践。应该使用 # selector ()而不是不推荐使用的文本字符串。

是的,在模拟器里。有时它不会识别选择器有一个错误,它似乎。即使我面对的不是你的代码,然后我只是改变了行动名称(选择器)。有用

let buttonPuzzle:UIButton = UIButton(frame: CGRectMake(100, 400, 100, 50))
buttonPuzzle.backgroundColor = UIColor.greenColor()
buttonPuzzle.setTitle("Puzzle", forState: UIControlState.Normal)
buttonPuzzle.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
buttonPuzzle.tag = 22;
self.view.addSubview(buttonPuzzle)

下面是一个选择器函数示例:

func buttonAction(sender:UIButton!) {
var btnsendtag:UIButton = sender
if btnsendtag.tag == 22 {
//println("Button tapped tag 22")
}
}

您应该能够通过访问 UIButtonTitleLabel属性以编程方式创建自定义 UI 按钮。

Swift 中的每个 类别参考: 关于 TitleLabel属性,它说“虽然这个属性是只读的,但它自己的属性是读/写的。使用这些属性主要是为了配置按钮的文本。”

斯威夫特中,可以像下面这样直接修改 titleLabel 的属性:

let myFirstButton = UIButton()
myFirstButton.titleLabel!.text = "I made a label on the screen #toogood4you"
myFirstButton.titleLabel!.font = UIFont(name: "MarkerFelt-Thin", size: 45)
myFirstButton.titleLabel!.textColor = UIColor.red
myFirstButton.titleLabel!.textAlignment = .center
myFirstButton.titleLabel!.numberOfLines = 5
myFirstButton.titleLabel!.frame = CGRect(x: 15, y: 54, width: 300, height: 500)

编辑

Swift 3.1语法

Swift: Ui 按钮以编程方式创建

let myButton = UIButton()
myButton.titleLabel!.frame = CGRectMake(15, 54, 300, 500)
myButton.titleLabel!.text = "Button Label"
myButton.titleLabel!.textColor = UIColor.redColor()
myButton.titleLabel!.textAlignment = .Center

在 Swift 中,我们可以通过编程方式创建一个按钮,方法是将这段代码写入 viewControler.Swift 文件..。

import UIKit


class ViewController: UIViewController
{
private let firstbutton:UIButton = UIButton()


override func viewDidLoad() {
super.viewDidLoad()
self.firstbutton = UIButton.buttonWithType(UIButtonType.Custom) as? UIButton
self.firstbutton!.frame = CGRectMake(100, 200, 100, 100)
self.firstbutton!.backgroundColor = UIColor.redColor()
self.firstbutton!.setTitle("My Button", forState: UIControlState.Normal)
self.firstbutton!.addTarget(self, action:#selector(self.firstButtonClicked), forControlEvents: .TouchUpInside)
self.view.addSubview(firstbutton!)
}


func firstButtonClicked(){
print("First Button Clicked")
}

试试这个. . 我希望它有帮助..。

override func viewDidLoad() {
super.viewDidLoad()


let btn = UIButton()
btn.frame = CGRectMake(10, 10, 50, 50)  //set frame
btn.setTitle("btn", forState: .Normal)  //set button title
btn.setTitleColor(UIColor.redColor(), forState: .Normal) //set button title color
btn.backgroundColor = UIColor.greenColor() //set button background color
btn.tag = 1 // set button tag
btn.addTarget(self, action: "btnclicked:", forControlEvents: .TouchUpInside) //add button action
self.view.addSubview(btn) //add button in view


}

这些是按钮点击事件。

func btnclicked(sender: UIButton!)
{
//write the task you want to perform on buttons click event..
}

iOS 9.1/Xcode 7.1.1/Swift 2.1中有限制的 UIButton:

import UIKit
import MapKit


class MapViewController: UIViewController {


override func loadView() {
mapView = MKMapView()  //Create a view...
view = mapView         //assign it to the ViewController's (inherited) view property.
//Equivalent to self.view = mapView


myButton = UIButton(type: .RoundedRect)  //RoundedRect is an alias for System (tested by printing out their rawValue's)
//myButton.frame = CGRect(x:50, y:500, width:70, height:50)  //Doesn't seem to be necessary when using constraints.
myButton.setTitle("Current\nLocation", forState: .Normal)
myButton.titleLabel?.lineBreakMode = .ByWordWrapping  //If newline in title, split title onto multiple lines
myButton.titleLabel?.textAlignment = .Center
myButton.setTitleColor(UIColor.whiteColor(), forState: .Normal)
myButton.layer.cornerRadius = 6   //For some reason, a button with type RoundedRect has square corners
myButton.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.5) //Make the color partially transparent
//Attempt to add padding around text. Shrunk the frame when I tried it.  Negative values had no effect.
//myButton.titleEdgeInsets = UIEdgeInsetsMake(-10,-10,-10,-10)
myButton.contentEdgeInsets = UIEdgeInsetsMake(5,5,5,5)  //Add padding around text.


myButton.addTarget(self, action: "getCurrentLocation:", forControlEvents: .TouchUpInside)
mapView.addSubview(myButton)


//Button Constraints:
myButton.translatesAutoresizingMaskIntoConstraints = false //***
//bottomLayoutGuide(for tab bar) and topLayoutGuide(for status bar) are properties of the ViewController
//To anchor above the tab bar on the bottom of the screen:
let bottomButtonConstraint = myButton.bottomAnchor.constraintEqualToAnchor(bottomLayoutGuide.topAnchor, constant: -20) //Implied call of self.bottomLayoutGuide. Anchor 20 points **above** the top of the tab bar.
//To anchor to the blue guide line that is inset from the left
//edge of the screen in InterfaceBuilder:
let margins = view.layoutMarginsGuide  //Now the guide is a property of the View.
let leadingButtonConstraint = myButton.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)


bottomButtonConstraint.active = true
leadingButtonConstraint.active = true
}




func getCurrentLocation(sender: UIButton) {
print("Current Location button clicked!")
}

该按钮锚定在标签栏上方的左下角。

Swift 2.2 Xcode 7.3

因为对于按钮回调方法,Objective-C 字符串文字现在已不推荐使用

let button:UIButton = UIButton(frame: CGRectMake(100, 400, 100, 50))
button.backgroundColor = UIColor.blackColor()
button.setTitle("Button", forState: UIControlState.Normal)
button.addTarget(self, action:#selector(self.buttonClicked), forControlEvents: .TouchUpInside)
self.view.addSubview(button)


func buttonClicked() {
print("Button Clicked")
}

Swift 3 Xcode 8

let button:UIButton = UIButton(frame: CGRect(x: 100, y: 400, width: 100, height: 50))
button.backgroundColor = .black
button.setTitle("Button", for: .normal)
button.addTarget(self, action:#selector(self.buttonClicked), for: .touchUpInside)
self.view.addSubview(button)


func buttonClicked() {
print("Button Clicked")
}

Swift 4 Xcode 9

let button:UIButton = UIButton(frame: CGRect(x: 100, y: 400, width: 100, height: 50))
button.backgroundColor = .black
button.setTitle("Button", for: .normal)
button.addTarget(self, action:#selector(self.buttonClicked), for: .touchUpInside)
self.view.addSubview(button)


@objc func buttonClicked() {
print("Button Clicked")
}

用编程方式创建,

var button: UIButton = UIButton(type: .Custom)


button.frame = CGRectMake(80.0, 210.0, 160.0, 40.0)


button.addTarget(self, action: #selector(self.aMethod), forControlEvents: .TouchUpInside)


button.tag=2


button.setTitle("Hallo World", forState: .Normal)


view.addSubview(button)




func aMethod(sender: AnyObject) {
print("you clicked on button \(sender.tag)")
}

对于 Swift 3 Xcode 8... ..。

let button = UIButton(frame: CGRect(x: 0, y: 0, width: container.width, height: container.height))
button.addTarget(self, action: #selector(self.barItemTapped), for: .touchUpInside)




func barItemTapped(sender : UIButton) {
//Write button action here
}

斯威夫特4/5

let button = UIButton(frame: CGRect(x: 20, y: 20, width: 200, height: 60))
button.setTitle("Email", for: .normal)
button.backgroundColor = .white
button.setTitleColor(UIColor.black, for: .normal)
button.addTarget(self, action: #selector(self.buttonTapped), for: .touchUpInside)
myView.addSubview(button)






@objc func buttonTapped(sender : UIButton) {
//Write button action here
}

Swift 3: 可以通过编程方式创建 UIButton

无论是在方法范围内,例如在 ViewDidLoad()中 一定要向按钮添加约束,否则您将看不到它

let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.target(forAction: #selector(buttonAction), withSender: self)
//button.backgroundColor etc


view.addSubview(button)


@objc func buttonAction() {
//some Action
}

或者作为全局变量从 module的任何地方访问它

let button: UIButton = {
let b = UIButton()
b.translatesAutoresizingMaskIntoConstraints = false
//b.backgroundColor etc
return b
}()

然后设置约束条件

func setupButtonView() {
view.addSubview(button)
button.widthAnchor.constraint(equalToConstant: 40).isActive = true
button.heightAnchor.constraint(equalToConstant: 40).isActive = true
// etc


}

Swift 4

private func createButton {
let sayButtonT = UIButton(type: .custom)
sayButtonT.addTarget(self, action: #selector(sayAction(_:)), for: .touchUpInside)
}


@objc private func sayAction(_ sender: UIButton?) {


}

UIButton 的快速“ Button Factory”扩展(当我们在这里)也适用于 UILabel,如下所示:

extension UILabel
{
// A simple UILabel factory function
// returns instance of itself configured with the given parameters


// use example (in a UIView or any other class that inherits from UIView):


//   addSubview(   UILabel().make(     x: 0, y: 0, w: 100, h: 30,
//                                   txt: "Hello World!",
//                                 align: .center,
//                                   fnt: aUIFont,
//                              fntColor: UIColor.red)                 )
//


func make(x: CGFloat, y: CGFloat, w: CGFloat, h: CGFloat,
txt: String,
align: NSTextAlignment,
fnt: UIFont,
fntColor: UIColor)-> UILabel
{
frame = CGRect(x: x, y: y, width: w, height: h)
adjustsFontSizeToFitWidth = true
textAlignment = align
text = txt
textColor = fntColor
font = fnt
return self
}
// Of course, you can make more advanced factory functions etc.
// Also one could subclass UILabel, but this seems to be a     convenient case for an extension.
}




extension UIButton
{
// UIButton factory returns instance of UIButton
//usage example:


// addSubview(UIButton().make(x: btnx, y:100, w: btnw, h: btnh,
// title: "play", backColor: .red,
// target: self,
// touchDown: #selector(play), touchUp: #selector(stopPlay)))




func make(   x: CGFloat,y: CGFloat,
w: CGFloat,h: CGFloat,
title: String, backColor: UIColor,
target: UIView,
touchDown:  Selector,
touchUp:    Selector ) -> UIButton
{
frame = CGRect(x: x, y: y, width: w, height: h)
backgroundColor = backColor
setTitle(title, for: .normal)
addTarget(target, action: touchDown, for: .touchDown)
addTarget(target, action: touchUp  , for: .touchUpInside)
addTarget(target, action: touchUp  , for: .touchUpOutside)


return self
}
}

在 Xcode Version 9.2(9C40b) Swift 4. x 中测试

如果你进入主情节串连图板部分,在右下角用一个正方形进入圆圈,并使用一个空白按钮。然后在代码中使用@IBAction 将其连接起来。然后可以用它创建一个@IBAction 函数。

IOS 12,Swift 4.2 & XCode 10.1

//For system type button
let button = UIButton(type: .system)
button.frame = CGRect(x: 100, y: 250, width: 100, height: 50)
//        button.backgroundColor = .blue
button.setTitle("Button", for: .normal)
button.setTitleColor(.white, for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 13.0)
button.titleLabel?.textAlignment = .center//Text alighment center
button.titleLabel?.numberOfLines = 0//To display multiple lines in UIButton
button.titleLabel?.lineBreakMode = .byWordWrapping//By word wrapping
button.tag = 1//To assign tag value
button.btnProperties()//Call UIButton properties from extension function
button.addTarget(self, action:#selector(self.buttonClicked), for: .touchUpInside)
self.view.addSubview(button)


//For custom type button (add image to your button)
let button2 = UIButton(type: .custom)
button2.frame = CGRect(x: 100, y: 400, width: 100, height: 50)
//        button2.backgroundColor = .blue
button2.setImage(UIImage.init(named: "img.png"), for: .normal)
button2.tag = 2
button2.btnProperties()//Call UIButton properties from extension function
button2.addTarget(self, action:#selector(self.buttonClicked), for: .touchUpInside)
self.view.addSubview(button2)


@objc func buttonClicked(sender:UIButton) {
print("Button \(sender.tag) clicked")
}


//You can add UIButton properties like this also
extension UIButton {
func btnProperties() {
layer.cornerRadius = 10//Set button corner radious
clipsToBounds = true
backgroundColor = .blue//Set background colour
//titleLabel?.textAlignment = .center//add properties like this
}
}

Swift 4.2-XCode 10.1

做个了结

let button: UIButton = {
let button = UIButton(type: .system)
button.titleLabel?.font = UIFont.systemFont(ofSize: 20)
...
return button
}()

Swift 5.0

        let button = self.makeButton(title: "Login", titleColor: .blue, font: UIFont.init(name: "Arial", size: 18.0), background: .white, cornerRadius: 3.0, borderWidth: 2, borderColor: .black)
view.addSubview(button)
// Adding Constraints
button.heightAnchor.constraint(equalToConstant: 40).isActive = true
button.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 40).isActive = true
button.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -40).isActive = true
button.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -400).isActive = true
button.addTarget(self, action: #selector(pressed(_ :)), for: .touchUpInside)


// Define commmon method
func makeButton(title: String? = nil,
titleColor: UIColor = .black,
font: UIFont? = nil,
background: UIColor = .clear,
cornerRadius: CGFloat = 0,
borderWidth: CGFloat = 0,
borderColor: UIColor = .clear) -> UIButton {
let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.setTitle(title, for: .normal)
button.backgroundColor = background
button.setTitleColor(titleColor, for: .normal)
button.titleLabel?.font = font
button.layer.cornerRadius = 6.0
button.layer.borderWidth = 2
button.layer.borderColor = UIColor.red.cgColor
return button
}
// Button Action
@objc func pressed(_ sender: UIButton) {
print("Pressed")
}

enter image description here

在 iOS15中,苹果引入了按钮配置(.gray().filled()等等)。

 var grayButton: UIButton!


func addButton() {
grayButton = UIButton(configuration: .gray())
grayButton.addTarget(self, action: #selector(buttonPressed(_:)), for: .touchUpInside)
grayButton.frame = CGRect(x: 10, y: 50, width: 150, height: 50)
grayButton.configuration?.title = "Press Me"
grayButton.configuration?.subtitle = "Sub Title"
grayButton.configuration?.image = UIImage(systemName: "house")
grayButton.configuration?.imagePadding = 10
grayButton.configuration?.imagePlacement = .leading
view.addSubview(grayButton)
}


@objc func buttonPressed(_ sender: UIButton) {
grayButton.configuration?.showsActivityIndicator = true
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
self.grayButton.configuration?.showsActivityIndicator = false
}
}

我们也可以显示和隐藏活动指示器内的按钮与 showsActivityIndicator属性。

我已经给出了在编码中创建按钮和设置约束的示例。此代码还包含以编程方式执行的按钮操作。

import UIKit


class ViewController: UIViewController {
  

  

lazy var button: UIButton! = {
    

let button = UIButton()
button.translatesAutoresizingMaskIntoConstraints = false
button.backgroundColor = .darkGray
button.setTitleColor(.white, for: .normal)
button.addTarget(self, action: #selector(didTaped(_:)), for: .touchUpInside)
button.tag = 1
button.setTitle("Tap", for: .normal)
return button
    

}()
  

lazy var label: UILabel! = {
    

let label = UILabel()
label.translatesAutoresizingMaskIntoConstraints = false
label.textColor = .black
label.font = .systemFont(ofSize: 17)
label.textAlignment = .center
return label
    

}()
    

override var preferredStatusBarStyle: UIStatusBarStyle{
return .darkContent
}
  

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.view.backgroundColor = .white
self.setConstraint()
    

}
  

@objc func didTaped(_ sender: UIButton){
    

self.label.text = "No of times Taped: \(sender.tag)"
self.button.tag += 1
    

}
  

func setConstraint(){
    

self.view.addSubview(self.button)
self.view.addSubview(self.label)
    

NSLayoutConstraint.activate([
    

self.button.heightAnchor.constraint(equalToConstant: 60),
self.button.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width * 0.66),
self.button.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
self.button.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
      

self.label.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
self.label.topAnchor.constraint(equalTo: self.button.topAnchor, constant: UIScreen.main.bounds.height * 0.12),
self.label.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: 10),


])


}
  

}

产出: enter image description here

   override func viewDidLoad() {
super.viewDidLoad()
let menuButton = UIButton(frame: .zero)
menuButton.addTarget(self, action: #selector(menuTapped), for: .touchUpInside)
view.addSubView(menuButton)
}


@objc func menuTapped() {
// do Stuff
}

在 Swift UIkit 中通过编程实现 UIButton 操作

创建 UIButton

lazy var seeMoreBtn: UIButton = {
let seeMoreBtn = UIButton()
seeMoreBtn.translatesAutoresizingMaskIntoConstraints = false
seeMoreBtn.setTitle("See More Answers", for: .normal)
seeMoreBtn.setTitleColor(.systemBlue, for: .normal)


//Action for  UIButton
seeMoreBtn.addTarget(self, action: #selector(seeMorePressed), for: .touchUpInside)


return seeMoreBtn
}()

添加@obj 函数

@objc func seeMorePressed() {
// Do something when click on Button
print("see more answer button")
}