ストーリーボードでシンプルな丸いボタンを作る方法は?


104

私はiOS開発の学習を始めたばかりで、単純な丸いボタンの作成方法が見つかりません。古いバージョンのリソースを見つけました。ボタンのカスタム背景を設定する必要がありますか?Androidでは9パッチだけを使用しますが、iOSにはこの機能がないことを知っています。

ここに画像の説明を入力してください

回答:


82

ストーリーボードでそれを行うには、ボタンの画像を使用する必要があります。

あるいは、コードでそれを行うことができます:

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

2
なぜclipsToBoundsが必要なのですか?その影は私が取り除くまで機能しないようです。
Gintas_

1
良い答えですが、画像なしでIBで実行できます。下記参照。
ゾーン

223

短い答え:はい

追加の背景画像やそのためのコードを記述する必要なく、絶対にシンプルな丸いボタンを作成できます。以下のスクリーンショットに従って、ボタンのランタイム属性を設定し、目的の結果を取得してください。

には表示されませStoryboardんが、プロジェクトを実行すると正常に動作します。

ここに画像の説明を入力してください

注:
ザ・「キーのパス」 layer.cornerRadiusと値は、値がボタンの高さと幅に応じて変更する必要がある5です。その式はボタンの高さ* 0.50です。値をいじって、シミュレーターまたは物理デバイスで予想される丸いボタンを確認します。ストーリーボードで複数のボタンを丸める場合、この手順は退屈に見えます。


9
否定的に投票する場合はコメントを追加してください。
Nishant

7
製図アプリの実行のようにIBがこれを表示できないのは残念です。
ウィリアムセルヌーク2017年

2
@WilliamCerniuk:実際にできます。nshipster.com/ibinspectable-ibdesignableをご覧
Nishant

ユーザー定義ランタイム属性の設定は実際に機能し、ビルド後にシミュレータで表示できます。
Cons Bulaquena

受け入れられた答えが言うように、これが機能するためにブールキーパスを追加する必要があるかもしれませんclipsToBounds
最大

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
断然最良の答えです。今日は素晴らしい新しいことを学びました!
マーク

2
この答えは完全ではありません。アプリを起動すると、xCodeは、アプリの実行時の実際のフレームサイズではなく、インターフェイスビルダーのビューのフレームサイズを使用します。
Simon Backx 2017

2
「willSet」の代わりに「didSet」を使用して、引数isRoundedを削除することもできます。
Simon Backx

1
背景画像を使用する場合は、次layer.masksToBounds = trueも設定します
zontar

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. 画像を参照してください。

ここに画像の説明を入力してください


同じ回答を繰り返し投稿しないでください。これはノイズと見なされます。異なる質問への回答を調整するか、それらが本当に同じ質問である場合は、重複としてフラグを立てることができます(十分な評判がある場合は、投票して終了します)。
エリクセニド2017

他の人がこれに遭遇したかどうかもわかりませんが、クラスをボタンに設定して半径、境界線の幅、境界線の色を指定するとすぐに、Xcode(9.2)はレンダリングエラーが発生したというエラーをスローします。アプリのビルドは成功しますが、赤い "!" 表示され続けます。ただ言う...私はコードのみのソリューションに切り替えました(これは本当にエレガントな方法でしたが)。
エイガー

10

これを行う最も簡単な方法は、cornerRadiusをビューの高さの半分に設定することです。

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

いいえ、しませんでした。高さと幅が同じである場合(つまり、正方形である場合)、円が表示されます。ただし、幅が高さより大きい場合、ボタンは正しくなります。
FrankkieNL 2018年

2
upvote -あなただ右、私はポスターが後に実際にあったものを示しているが、より受け入れ答えよりもあなたの答えと一致していることを疑問に含まれる画像を逃した
マイケル・ハドソン

4

IBOutletストーリーボードからyurボタンの接続ができます。

次に設定できます corner radius、ボタンを角を丸くするようにます。

例えば、あなたがoutletありmyButton、その後、

Obj-C

 self.myButton.layer.cornerRadius = 5.0 ;

迅速

  myButton.layer.cornerRadius = 5.0

あなたが正確な円形のボタンをしたい場合は、あなたのボタンのwidthheightでなければならないequalcornerRadius高さまたは幅/ 2(幅または高さの半分)に等しくなければなりません。


4

他の回答がこの作業の大部分をコードで実行することを提案しているため、ストーリーボードIBインターフェイスで変更を表示する方法を実際に提供したのは1つの回答のみです。私の答えは、ビュー、ボタン、画像などの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.