我想重新创建 iOS7 时钟应用程序中的圆形按钮。按钮基本上是具有不同外观的圆形,具体取决于按钮状态(绿色边框、红色边框、灰色填充)。
我当然可以使用带有不同状态图像的简单 UIButton 来实现这一点。
但是我正在寻找一种以编程方式绘制圆的解决方案,因此我可以轻松更改半径、笔划宽度等。
据我所知,UIButton 只允许我为每个状态定义一个 UIImage,所以我不能直接修改每个状态的图层(例如,提供一个带有cornerRadius 的图层)。还有其他方法吗?
创建自定义按钮可能会有所帮助。
在 .h 文件中;
#import <UIKit/UIKit.h>
@interface CircleLineButton : UIButton
- (void)drawCircleButton:(UIColor *)color;
@end
在 .m 文件中;
#import "CircleLineButton.h"
@interface CircleLineButton ()
@property (nonatomic, strong) CAShapeLayer *circleLayer;
@property (nonatomic, strong) UIColor *color;
@end
@implementation CircleLineButton
- (void)drawCircleButton:(UIColor *)color
{
self.color = color;
[self setTitleColor:color forState:UIControlStateNormal];
self.circleLayer = [CAShapeLayer layer];
[self.circleLayer setBounds:CGRectMake(0.0f, 0.0f, [self bounds].size.width,
[self bounds].size.height)];
[self.circleLayer setPosition:CGPointMake(CGRectGetMidX([self bounds]),CGRectGetMidY([self bounds]))];
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame))];
[self.circleLayer setPath:[path CGPath]];
[self.circleLayer setStrokeColor:[color CGColor]];
[self.circleLayer setLineWidth:2.0f];
[self.circleLayer setFillColor:[[UIColor clearColor] CGColor]];
[[self layer] addSublayer:self.circleLayer];
}
- (void)setHighlighted:(BOOL)highlighted
{
if (highlighted)
{
self.titleLabel.textColor = [UIColor whiteColor];
[self.circleLayer setFillColor:self.color.CGColor];
}
else
{
[self.circleLayer setFillColor:[UIColor clearColor].CGColor];
self.titleLabel.textColor = self.color;
}
}
@end
在视图控制器中,调用[self.myCircleButton drawCircleButton:[UIColor myColor]]
有很多方法可以实现这一点,例如:
使用CAShapedLayer
继承UIView并使用drawRect:方法画一个圆
只需有一个方形UIView并使用layer.cornerRadius 属性。
根据您的需要,创建普通 UIButton 并调用
myButton.layer.cornerRadius = myButton.bounds.size.width / 2.0;
可以工作(你需要包括Quartz框架)
添加此代码
imagePreview.layer.cornerRadius = (imagePreview.bounds.size.height/2);
其中 imagePreview 是 UIview/UIimageview/UIButton
不要忘记添加
#import <QuartzCore/QuartzCore.h>
我用来实现这种事情的模式是:
子类化UIButton
并实现drawRect
以根据需要绘制按钮,根据按钮的selected
和highlighted
属性自定义颜色。
然后覆盖setSelected
并setHighlighted
强制重绘,如下所示:
-(void)setHighlighted:(BOOL)highlighted {
[super setHighlighted:highlighted];
[self setNeedsDisplay];
}
快速扩展的解决方案:
extension UIView{
func asCircle(){
self.layer.cornerRadius = self.frame.size.width / 2;
self.layer.masksToBounds = true
}
}
打电话
myView.asCircle()
可以使用任何类型的视图,而不仅仅是按钮
你可以使用这个控件,它是 UIButton 的子类。 https://github.com/alvaromb/AMBCircularButton
我认为它运作良好。
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 (Strong, nonatomic) UIButton IBOutlet * myButton; )
在你的代码中写下: self.myButton.layer.cornerRadius = 50; // 50 是正方形一侧长度的一半。