在iOS7中创建不带图像的圆形按钮

在iOS7中创建不带图像的圆形按钮,ios,uibutton,ios7,Ios,Uibutton,Ios7,我想重新创建iOS7中时钟应用程序中的圆形按钮。按钮基本上是圆形,根据按钮状态(绿色边框、红色边框、灰色填充)具有不同的外观 当然,我可以使用一个简单的UIButton来实现这一点,其中包含不同状态的图像 然而,我正在寻找一个解决方案,它以编程方式绘制圆,因此我可以轻松地更改半径、笔划宽度等 据我所知,UIButton仅允许我为每个状态定义UIImage,因此我无法直接修改每个状态的图层(例如,提供一个具有cornerRadius的图层)。还有其他方法吗?有很多方法可以做到这一点,例如: 使用

我想重新创建iOS7中时钟应用程序中的圆形按钮。按钮基本上是圆形,根据按钮状态(绿色边框、红色边框、灰色填充)具有不同的外观

当然,我可以使用一个简单的UIButton来实现这一点,其中包含不同状态的图像

然而,我正在寻找一个解决方案,它以编程方式绘制圆,因此我可以轻松地更改半径、笔划宽度等


据我所知,UIButton仅允许我为每个状态定义UIImage,因此我无法直接修改每个状态的图层(例如,提供一个具有cornerRadius的图层)。还有其他方法吗?

有很多方法可以做到这一点,例如:

  • 使用CAShapedLayer

  • 子类UIView并使用drawRect:方法绘制圆

  • 只需拥有一个方形视图并使用层。cornerRadius 财产

根据您的需要,创建普通UIButton并调用

myButton.layer.cornerRadius = myButton.bounds.size.width / 2.0;

可以工作(您需要包括石英框架)

创建自定义按钮可能会有所帮助

在.h文件中

#import <UIKit/UIKit.h>
@interface CircleLineButton : UIButton

- (void)drawCircleButton:(UIColor *)color;

@end

在视图控制器中,调用
[self.myCircleButton drawCircleButton:[UIColor myColor]]

我用来实现这类功能的模式是:

子类化
ui按钮
并实现
drawRect
根据需要绘制按钮,根据所选的
和按钮突出显示的
属性自定义颜色

然后覆盖
setSelected
setHighlighted
以强制重画如下:

-(void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];
    [self setNeedsDisplay];
}
添加此代码

imagePreview.layer.cornerRadius = (imagePreview.bounds.size.height/2);
其中imagePreview是UIview/UIimageview/UIButton

别忘了加上

#import <QuartzCore/QuartzCore.h>
#导入

您可以使用此控件,它是UIButton的子类。

我认为它很管用

override func viewDidLoad() {
    super.viewDidLoad()

    var button = UIButton.buttonWithType(.Custom) as UIButton
    button.frame = CGRectMake(160, 100, 50, 50)
    button.layer.cornerRadius = 0.5 * button.bounds.size.width
    button.setImage(UIImage(named:"thumbsUp.png"), forState: .Normal)
    button.addTarget(self, action: "thumbsUpButtonPressed", forControlEvents: .TouchUpInside)
    view.addSubview(button)
}

func thumbsUpButtonPressed() {
    println("thumbs up button pressed")
}
  • 在故事板中,制作方形UIButton(例如100*100)

  • 链接出口(例如@property(强,非原子)UIButton IBOutlet*myButton;)

  • 在代码中编写以下内容: self.myButton.layer.cornerRadius=50 //50是正方形一侧长度的一半


  • 具有快速扩展功能的解决方案:

    extension UIView{
        func asCircle(){
            self.layer.cornerRadius = self.frame.size.width / 2;
            self.layer.masksToBounds = true
        }
    }
    
    就打电话

    myView.asCircle()
    

    可以处理任何类型的视图,而不仅仅是按钮

    您是否考虑过绘制圆形视图并向其添加点击手势?只是一个想法。是的,那可能有用。但是,我想避免重新创建UIButton功能。因此,如果有一个UIButton解决方案,我会更喜欢。是的,我可以画一个很好的圆,但是我如何将不同的圆状态(红色、绿色、灰色填充)连接到UIButton状态?最好使用尽可能少的代码:-)我可以连接几个侦听器并相应地显示/隐藏圆圈,但这感觉有点过分。我认为最好的做法是创建一个普通的UIButton,并添加一个CAShapedLayer(具有圆圈形状)作为该按钮图层的遮罩属性。这将给我一个一般的圆形外观,但我无法为每个按钮状态定义不同的边框/填充颜色,对吗?我只能通过setBackgroundImage:forState为每个状态提供UIImage:我发现您需要使用
    [self.layer insertSublayer:self.circleLayer atIndex:0]
    在标题文本标签下方插入圆圈,否则高亮显示时按钮位于纯色下方。这是一种优越得多的方法。它省去了你处理点击检测、旋转、自动布局等问题的麻烦。只需将按钮旋转,而不是添加一个额外的层。这对我来说很好。确保你的按钮框是方形的,或者你的圆形按钮是椭圆形的。还应将圆的路径缩进两个像素,以考虑线宽。否则,你会在边上留下一些平边。这是最简单、最简单的解决方案。对我来说效果很好,而且实现起来非常快。轻微的修改:
    self.frame.size.width
    myView.asCircle()