프로그래밍 방식으로 단추를 만드는 방법은 무엇입니까?


256

UIButtonSwift에서 프로그래밍 방식으로 그래픽 요소 (예 :)를 작성하려면 어떻게해야 합니까? 뷰에 버튼을 만들고 추가하려고했지만 할 수 없었습니다.

답변:


414

다음은 targetAction을 사용 하여 UIButton프로그래밍 방식으로 추가하는 완벽한 솔루션 입니다. 스위프트 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")
}

각 iPhone 화면에 버튼을 올바르게 배치하는 NSLayoutConstraint것보다 사용하는 것이 좋습니다 frame.

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")
}

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")
}

경우 위는 여전히 작동 func buttonAction선언 privateinternal.


3
그리고 목표 클래스는 NSObject에서 파생되어야한다는 것을 잊지 마십시오
Alexey Globchastyy

7
잊지 해달라고 당신의 행동은 개인이 될 수있는 기능
파블로 Zbigy 블론스키

2
함수를 사용하는 대신 문자열로 작업을 수행하기로 결정한 것이 이상합니다 (문자열을 사용하면 선택기보다 안전하지 않습니다!). 아마도 Obj-C와의 호환성 :(
Ixx

버튼 모서리 반경을 변경하는 방법이 있습니까?
MoralCode

3
Swift 1.2에서 다운 캐스트는 더 이상 "as"로 수행 할 수 없으므로 "as!"로 "실패 가능"해야합니다.
TenaciousJay

100

프로그래밍 방식으로 UIButton, UIlable 및 UITextfield를 프로그래밍 방식으로 추가 할 수 있습니다.

UIButton 코드

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

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)

UITextField 코드

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

이것이 당신에게 도움이되기를 바랍니다.


UIButton 전에 공유 한 첫 번째 코드 행에 "as"연산자가 필요한 이유는 무엇입니까?
zumzum

buttonWithType은 AnyObject 유형을 반환하므로 UIButton으로 캐스팅해야합니다.
Chris C

1
@ElgsQianChen 요구 사항에 따라이 코드를 사용할 수 있습니다. 예를 들어 view가 나타날 때 UIButton을 추가하려면 viewWillAppear에 코드를 추가하십시오.
Akhtar

1
Swift 1.2에서 다운 캐스트는 더 이상 "as"로 수행 할 수 없으므로 "as!"로 "실패 가능"해야합니다.
TenaciousJay

Objective C String 리터럴을 사용하는 사람들을 위해 경고가 더 이상 사용되지 않습니다. 정답은 다음과 같습니다. stackoverflow.com/a/36308587/968848
n.by.n

61

스위프트 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")
}

스위프트 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")
 }

button.frame = (frame: CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50))해야button.frame = CGRect(x: self.view.frame.size.width - 60, y: 20, width: 50, height: 50)
JC

2
"func"이전의 Swift 4에서는 "@objc"를 추가해야합니다.
Ruslan Leshchenko

29

스위프트 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")
}

산출

여기에 이미지 설명을 입력하십시오


고마워, m8! 오늘 Swift로 시작해서 모든 것이 이상합니다 (:
Felipe

17

사용하여이 작업을 수행하는 방법 스위프트 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")
}

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

 }

14

API는 변경되지 않았으며 구문 만 변경되었습니다. 당신은 UIButton이것을 만들고 다음 과 같이 추가 할 수 있습니다 :

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

7

이런 식으로 만들 수 있으며 이와 같은 동작을 추가 할 수 있습니다 ....

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")
}

죄송하지만 컴파일러는 self.view.addSubview (view : myButton) 행에 오류를 보냈습니다. 다음 오류입니다 : "외부 인수 레이블 'view :'호출"
val_lek

이 줄을 삭제하십시오 self.view.addSubview (view : myButton) 자세한 내용은 편집 된 답변을 참조하십시오.
Dharmbir Singh 2018 년

고맙지 만 self.view에이 버튼을 어떻게 추가 할 수 있습니까?
val_lek

6

viewDidLoad
// add 버튼 에이 코드를 추가하십시오

            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)

이 기능을 외부에 작성하십시오. 버튼을 탭하면 호출됩니다.

func buttonTapAction(sender:UIButton!)
{
    println("Button is working")
}

6

Swift 2 및 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)

6

스위프트 5의 경우 스위프트 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")
 }

4

것이 가능하다. 신속한 구문을 사용하는 것을 제외하고는 거의 같은 방식으로 모든 것을 수행합니다. 예를 들어 다음과 같은 코드로 UIButton을 만들 수 있습니다.

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

3

스토리 보드에서 UIButton을 만들려면 : 1-스토리 보드 파일에서 객체 라이브러리에서 ViewController로 UIButton 객체를 드래그합니다. 2-보조 편집기 표시 3-UIButton에서 마우스 오른쪽 버튼을 클릭하여 클래스로 드래그합니다. 결과는 다음과 같습니다.

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

프로그래밍 방식으로 UIButton 만들기 : 1- "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- IBAction 기능을 추가하십시오.

@IBAction func buttonActionFromCode(sender:UIButton)
{
    println("Button Action From Code")
}

Swift 1.2에서 다운 캐스트는 더 이상 "as"로 수행 할 수 없으므로 "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();
    }

3

응 시뮬레이터에서 선택기를 인식하지 못하는 버그가있는 경우가 있습니다. 심지어 귀하의 코드가 아닌 경우에도 액션 이름 (선택기)을 변경했습니다. 효과가있다

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")
    }
}

같은 문제가 발생하는 것 같습니다. 처음에는 스토리 보드에서 IBAction 버튼을 만들었지 만 "인식되지 않은 선택기가 인스턴스로 전송되었습니다"를 얻은 다음 IBAction을 삭제하고 .addTarget을 사용하여 시도했는데 둘 다 동일한 오류가 발생했습니다.
RayInNoIL

나를 위해 일한 것은 .swift 파일의 모든 IBOutlet 및 IBAction 코드와 InterfaceBuilder의 모든 연결을 삭제하는 것이 었습니다. 그런 다음 모든 것을 다시 만듭니다.
RayInNoIL

2

이것은 매우 잘 작동합니다. #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")
}

2

프로그래밍 방식으로 버튼 추가를 위해이 샘플 코드를 Swift 4.2에 작성하십시오.

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")
}

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")
    }

1

1 단계 : 새 프로젝트 만들기

여기에 이미지 설명을 입력하십시오

2 단계 : 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.
    }


}

0

스위프트 : 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
self.view.addSubview(myButton)

0

여기에 이미지 설명을 입력하십시오

 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")
         }

0

나는 보통 UIBotton의 확장을 설정합니다. 스위프트 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) 
        }
    }

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

2
항상 코드에 설명을 추가하는 것이 좋습니다
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);

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.