1

我必须绘制一个椭圆形按钮,我不想将图像设置为椭圆形。

我读过您可以使用 UIBezierPath 绘制不同的形状,但我无法绘制正确的椭圆形。

这是用于创建圆形的代码。

self.layer.borderWidth=1.0;

self.clipsToBounds = YES;
[self setTitleColor:ktextColor forState:UIControlStateNormal];

self.layer.cornerRadius = self.bounds.size.width/2;//half of the width
self.layer.borderColor=[[UIColor whiteColor]CGColor];

任何帮助表示赞赏!

4

4 回答 4

2

您可以为按钮层设置委托并实现委托方法“displayLayer:”

-(void)displayLayer:(CALayer *)layer
{
  UIGraphicsBeginImageContext(layer.frame.size);
  CGContextRef context = UIGraphicsGetCurrentContext();    

  UIBezierPath* ovalPath = [UIBezierPath bezierPathWithOvalInRect: CGRectMake(0.0, 0.0, CGRectGetWidth(layer.frame), CGRectGetHeight(layer.frame))];
  [[UIColor whiteColor] setFill];
  [ovalPath fill];
  [[UIColor blackColor] setStroke];
  ovalPath.lineWidth = 1;
  [ovalPath stroke];

  UIImage *imageBuffer = UIGraphicsGetImageFromCurrentImageContext();
  UIGraphicsEndImageContext();

  layer.contents = (id)[imageBuffer CGImage];
}
于 2013-09-09T06:50:49.833 回答
1

您还可以创建一个 CAShapelayer,然后向图层添加手势,如下所示:

-(void)generateOvalWithSize:(CGSize)size origin:(CGPoint)origin {
CAShapeLayer ovalLayer = [CAShapeLayer layer];

CGMutablePathRef ovalPath = CGPathCreateMutable();
CGPathAddEllipseInRect(ovalPath, NULL, CGRectMake(origin.x, origin.y, size.width, size.height));
CGPathCloseSubpath(ovalPath);

ovalLayer.path = ovalPath;

// Configure the apperence of the circle
ovalLayer.fillColor = [UIColor whiteColor].CGColor;
ovalLayer.strokeColor = [UIColor whiteColor].CGColor;
ovalLayer.lineWidth = 2;
// Add to parent layer
[[self layer] addSublayer:ovalLayer];

}
于 2013-09-09T07:21:56.317 回答
1

我已经使用这两个功能有一段时间了,我还没有遇到任何问题,但是如果有人看到问题,请告诉我。

你可以传递任何 UIView 的子类(即 UIButton、UICollectionViewCell 等)

+ (void)setCornerRadius:(CGFloat)radius forView:(UIView*)view
{
  [view.layer setCornerRadius:radius];
  [view.layer setMasksToBounds:YES];
}

+ (void)setBordersForView:(UIView*)view width:(CGFloat)width color:(UIColor*)color
{
  view.layer.borderColor = color.CGColor;
  view.layer.borderWidth = width;
}

以上在集合视图中产生了以下效果:

在此处输入图像描述

集合视图单元格有一个按钮,它一直绑定在边缘(自动布局)并占据单元格的整个高度和宽度。

然后我将整个单元格(或 self.viewForBaseLineLayout,如果从单元格内调用)作为视图参数传递给上面列出的两个函数。

对于半径参数,我通过了 20.0f。(但是这个值会根据你传递的视图的大小而变化;你只需要玩弄它)

我知道这篇文章很旧,但也许它会帮助新的人:)

于 2015-07-13T22:03:05.457 回答
0

您可以使用 OBShapedButton 类在此处下载

于 2013-09-09T07:14:55.457 回答