如何创建椭圆形UIButton

时间:2013-09-09 06:40:28

标签: iphone ios uibutton uibezierpath

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

我已经读过您可以使用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 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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];

}

答案 2 :(得分: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;
}

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

enter image description here

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

然后我传入整个单元格(或者在单元格内调用self.viewForBaseLineLayout)作为上面列出的两个函数中的view参数。

对于我传递20.0f的radius参数。 (但是这个值会根据你传递的视图的大小而变化;你只需要玩它就可以了)

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

答案 3 :(得分:0)

您可以使用OBShapedButton类Download Here