Storyboard에서 간단한 둥근 버튼을 만드는 방법은 무엇입니까?


104

방금 iOS 개발을 배우기 시작했는데 간단한 둥근 버튼을 만드는 방법을 찾을 수 없습니다. 이전 버전에 대한 리소스를 찾습니다. 버튼에 대한 사용자 정의 배경을 설정해야합니까? Android에서는 9 패치 만 사용하지만 iOS에는이 기능이 없다는 것을 알고 있습니다.

여기에 이미지 설명 입력

답변:


82

스토리 보드에서이를 수행하려면 버튼에 대한 이미지를 사용해야합니다.

또는 코드에서 수행 할 수 있습니다.

 btn.layer.cornerRadius = 10
 btn.clipsToBounds = true

2
clipsToBounds가 필요한 이유는 무엇입니까? 제거 할 때까지 그림자가 작동하지 않는 것 같습니다.
Gintas_

1
좋은 대답이지만 이미지없이 IB에서 할 수 있습니다. 아래를 참조하십시오.
zontar

223

짧은 답변 :

추가 배경 이미지 나 동일한 코드를 작성하지 않고도 간단한 둥근 버튼을 만들 수 있습니다. 원하는 결과를 얻으려면 버튼의 런타임 속성을 설정하려면 아래 스크린 샷을 따르십시오.

에 표시되지 Storyboard않지만 프로젝트를 실행하면 제대로 작동합니다.

여기에 이미지 설명 입력

주 : '주요 경로' 과 값이 값이 버튼의 높이와 폭에 따라 변경 될 필요가 5이다. 공식은 버튼의 높이 * 0.50입니다. 따라서 시뮬레이터 또는 물리적 장치에서 예상되는 둥근 버튼을 보려면 값을 조정하십시오. 이 절차는 스토리 보드에 둥글게 할 버튼이 두 개 이상있을 때 지루해 보입니다.
layer.cornerRadius


9
부정적으로 투표 할 때 의견을 추가하십시오.
Nishant

7
IB가 이것을 밀 드로잉 앱의 실행처럼 보여줄 수 없다는 것은 아쉽습니다.
William Cerniuk 2017 년

2
@WilliamCerniuk : 실제로 할 수 있습니다. 확인 nshipster.com/ibinspectable-ibdesignable
Nishant

사용자 정의 런타임 속성 설정은 실제로 작동하며 빌드 후 시뮬레이터에서 볼 수 있습니다.
Cons Bulaquena

허용되는 답변에서 알 수 있듯이 clipsToBounds이것이 작동하려면 부울 키 경로를 추가해야 할 수도 있습니다 .
Max

86

다음과 같이 할 수 있습니다.

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? frame.size.height / 2 : 0
    }
}

클래스를 MyButtonin으로 설정 Identity Inspector하고 IB에서 rounded속성 을 갖게 됩니다.

여기에 이미지 설명 입력


4
단연 최고의 답변입니다. 오늘 굉장한 새로운 것을 배웠습니다!
Mark

2
이 대답은 완전하지 않습니다. 앱을 시작할 때 xCode는 앱이 실행될 때의 실제 프레임 크기가 아닌 인터페이스 빌더의보기 프레임 크기를 사용합니다.
Simon Backx

2
"willSet"대신 "didSet"를 사용하고 isRounded 인수를 제거 할 수도 있습니다.
Simon Backx

1
배경 이미지를 사용하는 경우 layer.masksToBounds = true도 설정하십시오.
zontar 2017

34
  1. Cocoa Touch 클래스를 만듭니다.

여기에 이미지 설명 입력

  1. RoundButton 클래스에 코드를 삽입합니다.

    import UIKit
    
    @IBDesignable
    class RoundButton: UIButton {
    
        @IBInspectable var cornerRadius: CGFloat = 0{
            didSet{
            self.layer.cornerRadius = cornerRadius
            }
        }
    
        @IBInspectable var borderWidth: CGFloat = 0{
            didSet{
                self.layer.borderWidth = borderWidth
            }
        }
    
        @IBInspectable var borderColor: UIColor = UIColor.clear{
            didSet{
                self.layer.borderColor = borderColor.cgColor
            }
        }
    }
  2. 이미지를 참조하십시오.

여기에 이미지 설명 입력


동일한 답변을 반복적으로 게시하지 마십시오. 이것은 소음으로 간주됩니다. 서로 다른 질문에 대한 답변을 조정하거나 실제로 동일한 질문 인 경우 중복으로 플래그를 지정할 수 있습니다 (평판이 충분하면 투표를 통해 종료).
elixenide

다른 사람들도 이것에 부딪 혔는지 모르겠지만 클래스를 버튼으로 설정하고 반경, 테두리 너비 및 테두리 색상을 지정하자마자 Xcode (9.2)에서 렌더링 오류가 있다는 오류가 발생합니다. 앱 빌드는 성공했지만 빨간색 "!" 계속 표시됩니다. 그냥 ... 코드 전용 솔루션으로 다시 전환했습니다 (정말 우아한 방법 임에도 불구하고).
Aeger

10

가장 쉬운 방법은 cornerRadius를 뷰 높이의 절반으로 설정하는 것입니다.

button.layer.cornerRadius = button.bounds.size.height/2

아니요 나는 안 그랬어요. 높이와 너비가 같으면 (정사각형이되었을 것입니다) 원이 생깁니다. 그러나 너비가 높이보다 크면 버튼이 정확합니다.
FrankkieNL

2
upvote에 - 당신 맞아요, 나는 포스터가 실제로 무엇인지 보여줍니다 후 허용 대답보다 더 많은 답을 일치하는지 질문에 포함 된 이미지를 놓친
마이클 허드슨에게

4

IBOutlet스토리 보드에서 yur 버튼을 연결할 수 있습니다 .

그런 다음 corner radius버튼을 설정 하여 모서리를 둥글게 만들 수 있습니다.

예를 들어, 당신은 outlet이다 myButton, 다음

Obj-C

 self.myButton.layer.cornerRadius = 5.0 ;

빠른

  myButton.layer.cornerRadius = 5.0

그런 다음 정확한 둥근 버튼을 원하는 경우 버튼입니다 widthheight수 있어야 equal하고 cornerRadius(너비 또는 높이의 절반) 높이 또는 너비 / 2와 동일해야합니다.


4

다른 답변 이이 작업의 대부분을 코드로 수행하도록 제안했듯이 실제로 스토리 보드 IB 인터페이스에서 변경 사항을 볼 수있는 방법을 제공하는 답변은 하나뿐입니다. 내 대답은 뷰, 버튼, 이미지 등의 cornerRadius를 변경할 수 있도록 허용하여 그 대답을 뛰어 넘습니다.

다음 코드를 살펴보십시오. 이 코드를 사용하려면 RoundedView라는 새 파일을 만들고 원하는 파일을 만든 다음 스토리 보드로 이동하여 클래스를 "RoundedView", "RoundedImageView"또는 "RoundedButton"으로 변경합니다.

import UIKit

@IBDesignable class RoundedImage: UIImageView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedView: UIView
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

@IBDesignable class RoundedButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()

        updateCornerRadius()
    }

    @IBInspectable var rounded: Bool = false {
        didSet {
            updateCornerRadius()
        }
    }

    @IBInspectable var cornerRadius: CGFloat = 0.1 {
        didSet {
            updateCornerRadius()
        }
    }

    func updateCornerRadius() {
        layer.cornerRadius = rounded ? cornerRadius : 0
        layer.masksToBounds = rounded ? true : false
    }
}

1

layer.cornerRadius스토리 보드를 추가하는 동안 앞뒤에 공백이 없는지 확인하십시오. 복사 붙여 넣기를 수행하면 공백이 삽입 될 수 있습니다. XCode가 일종의 경고 또는 오류를 말하면 좋을 것입니다.


0

이 시도!!

 override func viewDidLoad() {
   super.viewDidLoad()

   var button = UIButton.buttonWithType(.Custom) as UIButton
   button.frame = CGRectMake(160, 100, 200,40)

   button.layer.cornerRadius =5.0
   button.layer.borderColor = UIColor.redColor().CGColor
   button.layer.borderWidth = 2.0

   button.setImage(UIImage(named:"Placeholder.png"), forState: .Normal)
   button.addTarget(self, action: "OnClickroundButton", forControlEvents: .TouchUpInside)
   button.clipsToBounds = true

   view.addSubview(button)
}
    func OnClickroundButton() {
   NSLog(@"roundButton Method Called");
}

0

확장은이 문제에 대한 최상의 옵션입니다. 보기 또는 버튼의 확장 만들기

public extension UIView {
  //Round the corners
  func roundCorners(){
    let radius = bounds.maxX / 16
    layer.cornerRadius = radius
  }
}

코드에서 호출

button.roundCorners()

0

내가 사용하고 Xcode의 버전 11.4을

속성 검사기에서 모서리 반경을 정의 할 수 있습니다.

스토리 보드에는 표시되지 않지만 프로젝트를 실행하면 제대로 작동합니다.

여기에 이미지 설명 입력


-1
import UIKit

@IBDesignable class MyButton: UIButton
{
    override func layoutSubviews() {
        super.layoutSubviews()


    }

    func updateCornerRadius(radius:CGFloat) {
        layer.cornerRadius = radius
    }
    @IBInspectable var cornerRadius:CGFloat = 0{
        didSet{
            updateCornerRadius(radius: cornerRadius)
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.