如何在情节提要中制作一个简单的圆形按钮?


104

我刚刚开始学习iOS开发,找不到如何制作简单的圆形按钮。我找到了旧版本的资源。我需要为按钮设置自定义背景吗?在Android中,我只会使用9补丁,但是我知道iOS不具备此功能。

在此处输入图片说明

Answers:


82

要在情节提要中执行此操作,您需要为按钮使用图像。

另外,您也可以在代码中执行此操作:

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

2
为什么需要clipsToBounds?看来,直到我将其删除,该阴影才起作用。
Gintas_

1
好的答案,但是您可以在IB中完成,而无需图像。见下文。
宗塔尔

223

简短答案:

您绝对可以制作一个简单的圆形按钮,而无需其他背景图像或为此编写任何代码。只需按照下面给出的屏幕截图,设置按钮的运行时属性,即可获得所需的结果。

它不会显示在中,Storyboard但是在您运行项目时它将正常工作。

在此处输入图片说明

注:
“关键路径” layer.cornerRadius和值是5的值需要根据按钮的高度和宽度被改变。公式为按钮的高度* 0.50。因此,请在该值附近进行操作,以在模拟器或物理设备上查看预期的四舍五入按钮。如果在情节提要板上要舍入多个按钮,则此过程将很繁琐。


9
否定投票时请添加评论。
Nishant

7
令人失望的是,IB不能像运行轧机绘图应用程序那样显示它。
William Cerniuk

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和in IB,您将拥有以下rounded属性:

在此处输入图片说明


4
迄今为止最好的答案。今天学到了一些很棒的新东西!
Mark

2
这个答案不完整。启动应用程序时,xCode将使用界面构建器中视图的框架大小,而不是应用程序运行时的实际框架大小。
西蒙·巴克斯

2
您也可以使用“ didSet”代替“ willSet”,并删除参数isRounded。
西蒙·贝克

1
如果您使用背景图片,设置layer.masksToBounds = true
zontar

34
  1. 创建一个可可接触类。

在此处输入图片说明

  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
没错,我想念包含在问题中的图片,该图片显示海报在匹配您的答案之后比实际答案更实际-投票
Michael Hudson

4

您可以连接 IBOutlet从情节提要中的按钮。

然后,您可以设置corner radius按钮使其成为圆角。

例如,你outletmyButton话,

对象-C

 self.myButton.layer.cornerRadius = 5.0 ;

迅速

  myButton.layer.cornerRadius = 5.0

如果要使用精确的圆形按钮,则按钮的widthheight必须为equalcornerRadius必须等于高度或宽度/ 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)
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.