Bagaimana cara membuat tombol secara terprogram?

256

Bagaimana saya secara terprogram membuat elemen grafis (seperti a UIButton) di Swift? Saya mencoba membuat dan menambahkan tombol ke tampilan, tetapi tidak berhasil.

val_lek
sumber

Jawaban:

414

Berikut ini adalah solusi lengkap untuk menambahkan secara UIButtonprogramatis dengan targetAction .
Cepat 2.2

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .greenColor()
  button.setTitle("Test Button", forState: .Normal)
  button.addTarget(self, action: #selector(buttonAction), forControlEvents: .TouchUpInside)

  self.view.addSubview(button)
}

func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

Mungkin lebih baik menggunakan NSLayoutConstraintdaripada framemenempatkan tombol dengan benar untuk setiap layar iPhone.

Kode yang diperbarui ke Swift 3.1 :

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .green
  button.setTitle("Test Button", for: .normal)
  button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

  self.view.addSubview(button)
}

func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

Kode yang diperbarui ke Swift 4.2 :

override func viewDidLoad() {
  super.viewDidLoad()

  let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
  button.backgroundColor = .green
  button.setTitle("Test Button", for: .normal)
  button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)

  self.view.addSubview(button)
}

@objc func buttonAction(sender: UIButton!) {
  print("Button tapped")
}

Di atas masih berfungsi jika func buttonActiondinyatakan privateatau internal.

Anil Varghese
sumber
3
dan jangan lupa bahwa kelas target Anda harus berasal dari NSObject
Alexey Globchastyy
7
dan jangan lupa bahwa fungsi yang merupakan tindakan Anda tidak dapat pribadi
Pablo Zbigy Jablonski
2
Sungguh aneh bahwa mereka memutuskan untuk melakukan aksi dengan string daripada menggunakan fungsi (dengan string bahkan lebih tidak aman daripada penyeleksi!). Kompatibilitas mundur dengan Obj-C mungkin :(
Ixx
Apakah ada cara untuk mengubah radius sudut tombol?
MoralCode
3
Pada Swift 1.2 downcast tidak lagi dapat dilakukan dengan "as", mereka harus "dipaksa tersedia" dengan "as!".
TenaciousJay
100

Anda dapat menambahkan UIButton, UIlable, dan UITextfield secara terprogram dengan cara ini.

Kode UIBton

// var button   = UIButton.buttonWithType(UIButtonType.System) as UIButton
let button = UIButton(type: .System) // let preferred over var here
button.frame = CGRectMake(100, 100, 100, 50)
button.backgroundColor = UIColor.greenColor()
button.setTitle("Button", forState: UIControlState.Normal)
button.addTarget(self, action: "Action:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)

Kode UILabel

var label: UILabel = UILabel()
label.frame = CGRectMake(50, 50, 200, 21)
label.backgroundColor = UIColor.blackColor()
label.textColor = UIColor.whiteColor()
label.textAlignment = NSTextAlignment.Center
label.text = "test label"
self.view.addSubview(label)

Kode UITextField

var txtField: UITextField = UITextField()
txtField.frame = CGRectMake(50, 70, 200, 30)
txtField.backgroundColor = UIColor.grayColor()
self.view.addSubview(txtField)

Semoga ini bermanfaat bagi Anda.

Akhtar
sumber
jadi, mengapa Anda memerlukan operator "sebagai" di baris pertama kode yang Anda bagikan sebelum UIButton ...?
zumzum
buttonWithType mengembalikan tipe AnyObject, jadi Anda perlu menampilkannya sebagai UIButton
Chris C
1
@ ElgsQianChen Anda dapat menggunakan kode ini sesuai dengan kebutuhan Anda. misalnya Anda ingin menambahkan UIButton ketika tampilan muncul, Anda menambahkan kode di viewWillAppear.
Akhtar
1
Pada Swift 1.2 downcast tidak lagi dapat dilakukan dengan "as", mereka harus "dipaksa tersedia" dengan "as!".
TenaciousJay
Untuk orang-orang yang mengalami peringatan String String literal usang, Jawaban yang benar ada di sini: stackoverflow.com/a/36308587/968848
n.by.n
61

Untuk Swift 3

let button = UIButton()
button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
button.backgroundColor = UIColor.red
button.setTitle("your Button Name", for: .normal)
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.view.addSubview(button)

func buttonAction(sender: UIButton!) {
    print("Button tapped")
}

Untuk Swift 4

 let button = UIButton()
 button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
 button.backgroundColor = UIColor.red
 button.setTitle("Name your Button ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

 @objc func buttonAction(sender: UIButton!) {
    print("Button tapped")
 }
Museer Ahamad Ansari
sumber
button.frame = (frame: CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50))seharusnyabutton.frame = CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50)
JC
2
Di Swift 4 sebelum "func" perlu menambahkan "@objc".
Ruslan Leshchenko
29

Cepat 3

let btn = UIButton(type: .custom) as UIButton
btn.backgroundColor = .blue
btn.setTitle("Button", for: .normal)
btn.frame = CGRect(x: 100, y: 100, width: 200, height: 100)
btn.addTarget(self, action: #selector(clickMe), for: .touchUpInside)
self.view.addSubview(btn)

func clickMe(sender:UIButton!) {
  print("Button Clicked")
}

Keluaran

masukkan deskripsi gambar di sini

pengguna3182143
sumber
Terima kasih, m8! Dimulai dengan Swift hari ini sehingga semuanya terasa aneh (:
Felipe
17

Cara melakukan ini menggunakan Swift 3.0 .

func createButton() {
    let button = UIButton(type: .system)
    button.frame = CGRect(x: 100.0, y: 100.0, width: 100.0, height: 100.0)
    button.setTitle(NSLocalizedString("Button", comment: "Button"), for: .normal)
    button.backgroundColor = .green
    button.addTarget(self, action: #selector(buttonAction(sender:)), for: .touchUpInside)
    view.addSubview(button)
}

@objc func buttonAction(sender: UIButton) {
    print("Button pushed")
}
CodeBender
sumber
16
 var sampleButton:UIButton?

 override func viewDidLoad() {
  super.viewDidLoad()

 }
 override func viewDidAppear(animated: Bool) {

  sampleButton = UIButton(type: .RoundedRect)
  //sampleButton.frame = CGRect(x:50, y:500, width:70, height:50)

  sampleButton!.setTitle("Sample \n UI Button", forState: .Normal)
  sampleButton!.titleLabel?.lineBreakMode = .ByWordWrapping
  sampleButton!.titleLabel?.textAlignment = .Center
  sampleButton!.setTitleColor(UIColor.whiteColor(), forState: .Normal)
  sampleButton!.layer.cornerRadius = 6
  sampleButton!.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.6)
  sampleButton?.tintColor =  UIColor.brownColor()


  //Add padding around text
  sampleButton!.titleEdgeInsets = UIEdgeInsetsMake(-10,-10,-10,-10)
  sampleButton!.contentEdgeInsets = UIEdgeInsetsMake(5,5,5,5)

  //Action set up
  sampleButton!.addTarget(self, action: "sampleButtonClicked", forControlEvents: .TouchUpInside)
  self.view.addSubview(sampleButton!)


  //Button Constraints:
  sampleButton!.translatesAutoresizingMaskIntoConstraints = false

  //To anchor above the tab bar on the bottom of the screen:
  let bottomButtonConstraint = sampleButton!.bottomAnchor.constraintEqualToAnchor(bottomLayoutGuide.topAnchor, constant: -20)

  //edge of the screen in InterfaceBuilder:
  let margins = view.layoutMarginsGuide
  let leadingButtonConstraint = sampleButton!.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor)

  bottomButtonConstraint.active = true
  leadingButtonConstraint.active = true


 }
 func sampleButtonClicked(){

  print("sample Button Clicked")

 }
AG
sumber
14

API belum berubah - hanya sintaks yang dimiliki. Anda dapat membuat UIButtondan menambahkannya seperti ini:

var button = UIButton(frame: CGRectMake(0, 0, 50, 50))
self.view.addSubview(button) // assuming you're in a view controller
Cezary Wojcik
sumber
7

Anda dapat membuat seperti ini dan Anda dapat menambahkan tindakan juga seperti ini ....

import UIKit

let myButton = UIButton(frame: CGRect(x: 0, y: 0, width: 50, height: 50))

init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!)
{       super.init(nibName: nibName, bundle: nibBundle) 
        myButton.targetForAction("tappedButton:", withSender: self)
}

func tappedButton(sender: UIButton!)
{ 
     println("tapped button")
}
Dharmbir Singh
sumber
maaf, tetapi kompiler mengirim kesalahan sejalan - self.view.addSubview (lihat: myButton). Kesalahan berikutnya: "label argumen asing 'view:' in call"
val_lek
Silakan hapus baris ini self.view.addSubview (lihat: myButton) Untuk info lebih lanjut lihat jawaban saya yang diedit.
Dharmbir Singh
Terima kasih, tetapi bagaimana saya bisa menambahkan tombol ini di self.view?
val_lek
6

Tambahkan kode ini di viewDidLoad
// add Button

            var button=UIButton(frame: CGRectMake(150, 240, 75, 30))
            button.setTitle("Next", forState: UIControlState.Normal)
            button.addTarget(self, action: "buttonTapAction:", forControlEvents: UIControlEvents.TouchUpInside)
            button.backgroundColor = UIColor.greenColor()
            self.view.addSubview(button)

Tulis fungsi ini di luarnya, ini akan memanggil ketika Anda menekan tombol

func buttonTapAction(sender:UIButton!)
{
    println("Button is working")
}
Nimmy Alphonsa Jose
sumber
6

Di Swift 2 dan iOS 9.2.1

var button: UIButton = UIButton(type: UIButtonType.Custom) as UIButton
self.button.frame = CGRectMake(130, 70, 60, 20)
self.button.setTitle("custom button", forState: UIControlState.Normal)
self.button.addTarget(self, action:"buttonActionFuncName", forControlEvents: UIControlEvents.TouchUpInside)
self.button.setTitleColor(UIColor.blackColor(), forState: .Normal)
self.button.layer.borderColor = UIColor.blackColor().CGColor
self.button.titleLabel?.font = UIFont(name: "Helvetica-Bold", size: 13)
self.view.addSubview(self.button)
Muhammad Qasim
sumber
6

Untuk Swift 5 sama seperti Swift 4

 let button = UIButton()
 button.frame = CGRect(x: self.view.frame.size.width - 60, y: 60, width: 50, height: 50)
 button.backgroundColor = UIColor.red
 button.setTitle("Name your Button ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

 @objc func buttonAction(sender: UIButton!) {
    print("Button tapped")
 }
Zgpeace
sumber
4

Itu mungkin. Anda melakukan semuanya dengan cara yang sama kecuali menggunakan sintaks cepat. Misalnya, Anda dapat membuat UIButton dalam kode seperti ini:

 var button: UIButton = UIButton(frame: CGRectMake(0, 0, 100, 100))
Connor
sumber
3

Untuk membuat UIButton dari storyboard: 1 - Seret objek UIButton dari Perpustakaan Objek ke ViewController dalam file storyboard 2 - Perlihatkan Asisten editor 3 - Seret dengan klik kanan dari UIButton buat di atas ke dalam kelas Anda. Hasilnya adalah sebagai berikut:

@IBAction func buttonActionFromStoryboard(sender: UIButton)
{
    println("Button Action From Storyboard")
}

Untuk membuat UIButton secara terprogram: 1- Tuliskan ke "override func viewDidLoad ()":

        let uiButton    = UIButton.buttonWithType(UIButtonType.System) as UIButton
        uiButton.frame  = CGRectMake(16, 116, 288, 30)
        uiButton.setTitle("Second", forState: UIControlState.Normal);
        uiButton.addTarget(self, action: "buttonActionFromCode:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(uiButton)

2- menambahkan fungsi IBAction:

@IBAction func buttonActionFromCode(sender:UIButton)
{
    println("Button Action From Code")
}
Alessandro Pirovano
sumber
Pada Swift 1.2 downcast tidak lagi dapat dilakukan dengan "as", mereka harus "dipaksa tersedia" dengan "as!".
TenaciousJay
3
            let myFirstButton = UIButton()
            myFirstButton.setTitle("Software Button", forState: .Normal)
            myFirstButton.setTitleColor(UIColor.redColor(), forState: .Normal)
            myFirstButton.frame = CGRectMake(100, 300, 150, 50)
            myFirstButton.backgroundColor = UIColor.purpleColor()
            myFirstButton.layer.cornerRadius = 14
            myFirstButton.addTarget(self, action: "pressed:", forControlEvents: .TouchUpInside)
            self.view.addSubview(myFirstButton)
            myFirstButton.hidden=true
            nameText.delegate = self


func pressed(sender: UIButton!) {
        var alertView = UIAlertView()
        alertView.addButtonWithTitle("Ok")
        alertView.title = "title"
        alertView.message = "message"
        alertView.show();
    }
abdul sathar
sumber
3

Ya dalam simulator. Beberapa kali tidak akan mengenali pemilih ada bug yang tampaknya. Bahkan saya menghadapi bukan karena kode Anda, maka saya hanya mengubah nama tindakan (pemilih). Berhasil

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)

Fungsi Selektor Ada di Sini:

func buttonAction(sender:UIButton!)
{

    var btnsendtag:UIButton = sender
    if btnsendtag.tag == 22 {            
        //println("Button tapped tag 22")
    }
}
Dharmesh Kheni
sumber
Sepertinya saya mengalami masalah yang sama. Saya awalnya membuat tombol IBAction di storyboard, tapi saya mendapatkan "pemilih yang tidak dikenal dikirim ke instance", kemudian saya menghapus IBAction yang dibuat seperti itu dan mencoba menggunakan .addTarget, keduanya mengarah ke kesalahan yang sama.
RayInNoIL
Apa yang berhasil bagi saya adalah menghapus semua kode IBOutlet dan IBAction dalam file .swift dan semua koneksi di InterfaceBuilder. Kemudian menciptakan kembali semuanya.
RayInNoIL
2

Ini berfungsi dengan baik untuk saya, #DynamicButtonEvent #IOS #Swift #Xcode

func setupButtonMap(){
    let mapButton = UIButton(type: .system)
    mapButton.setImage(#imageLiteral(resourceName: "CreateTrip").withRenderingMode(.alwaysOriginal), for: .normal)
    mapButton.frame = CGRect(x: 0, y: 0, width: 34, height: 34)
    mapButton.contentMode = .scaleAspectFit
    mapButton.backgroundColor = UIColor.clear
    mapButton.addTarget(self, action: #selector(ViewController.btnOpenMap(_:)), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: mapButton)
    }
@IBAction func btnOpenMap(_ sender: Any?) {
    print("Successful")
}
Lex
sumber
2

Tulis kode contoh ini dalam Swift 4.2 untuk menambahkan Tombol Secara Programatis.

override func viewDidLoad() {
    super.viewDidLoad()
        let myButton = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 50))
        myButton.backgroundColor = .green
        myButton.setTitle("Hello UIButton", for: .normal)
        myButton.addTarget(self, action: #selector(myButtonAction), for: .touchUpInside)
        self.view.addSubview(myButton)
}

 @objc func myButtonAction(sender: UIButton!) {
    print("My Button tapped")
}
Parth
sumber
1
    // UILabel:
    let label = UILabel()
    label.frame = CGRectMake(35, 100, 250, 30)
    label.textColor = UIColor.blackColor()
    label.textAlignment = NSTextAlignment.Center
    label.text = "Hello World"
    self.view.addSubview(label)

    // UIButton:
    let btn: UIButton = UIButton(type: UIButtonType.Custom) as UIButton
    btn.frame = CGRectMake(130, 70, 60, 20)
    btn.setTitle("Click", forState: UIControlState.Normal)
    btn.setTitleColor(UIColor.blackColor(), forState: .Normal)
    btn.addTarget(self, action:Selector("clickAction"), forControlEvents: UIControlEvents.TouchUpInside)
    view.addSubview(btn)


    // Button Action:
    @IBAction func clickAction(sender:AnyObject)
    {
        print("Click Action")
    }
Sang Raja
sumber
1

Langkah 1: Buat proyek baru

masukkan deskripsi gambar di sini

Langkah 2: di ViewController.swift

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // CODE
        let btn = UIButton(type: UIButtonType.System) as UIButton        
        btn.backgroundColor = UIColor.blueColor()
        btn.setTitle("CALL TPT AGENT", forState: UIControlState.Normal)
        btn.frame = CGRectMake(100, 100, 200, 100)
        btn.addTarget(self, action: "clickMe:", forControlEvents: UIControlEvents.TouchUpInside)
        self.view.addSubview(btn)

    }

    func clickMe(sender:UIButton!) {
      print("CALL")
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

sumber
0

Swift: Tombol Ui buat secara pemrograman

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
self.view.addSubview(myButton)
Shanmugasundharam
sumber
0

masukkan deskripsi gambar di sini

 func viewDidLoad(){
                    saveActionButton = UIButton(frame: CGRect(x: self.view.frame.size.width - 60, y: 0, width: 50, height: 50))
                    self.saveActionButton.backgroundColor = UIColor(red: 76/255, green: 217/255, blue: 100/255, alpha: 0.7)
                    saveActionButton.addTarget(self, action: #selector(doneAction), for: .touchUpInside)
                    self.saveActionButton.setTitle("Done", for: .normal)
                    self.saveActionButton.layer.cornerRadius = self.saveActionButton.frame.size.width / 2
                    self.saveActionButton.layer.borderColor = UIColor.darkGray.cgColor
                    self.saveActionButton.layer.borderWidth = 1
                    self.saveActionButton.center.y = self.view.frame.size.height - 80
                    self.view.addSubview(saveActionButton)
        }

          func doneAction(){
          print("Write your own logic")
         }
Sai kumar Reddy
sumber
0

Saya biasanya pergi untuk menyiapkan ekstensi UIBotton. Cepat 5.

let button: UIButton = UIButton()
override func viewDidLoad() {
        super.viewDidLoad()
     button.setup(title: "OK", x: 100, y: 430, width: 220, height: 80, color: .yellow)
        buttonD.setTitleColor(.black, for: .normal)

}
extension UIButton {
    func setup(title: String, x: CGFloat, y: CGFloat, width: CGFloat, height: CGFloat, color: UIColor){
        frame = CGRect(x: x, y: y, width: width, height: height)
        backgroundColor = color
        setTitle(title , for: .normal) 
        }
    }
Akar bit
sumber
-1
Uilabel code 

var label: UILabel = UILabel()
label.frame = CGRectMake(50, 50, 200, 21)
label.backgroundColor = UIColor.blackColor()
label.textColor = UIColor.whiteColor()
label.textAlignment = NSTextAlignment.Center
label.text = "test label"
self.view.addSubview(label)
varun
sumber
2
Itu selalu disarankan untuk menambahkan beberapa penjelasan ke kode Anda
Bowdzone
-2
override func viewDidLoad() {

super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    var imageView = UIImageView(frame: CGRectMake(100, 150, 150, 150));
    var image = UIImage(named: "BattleMapSplashScreen.png");
    imageView.image = image;
    self.view.addSubview(imageView);

}
Durgesh
sumber