如何创建仅具有左上角和左下角半径的圆形 UIButton

Posted

技术标签:

【中文标题】如何创建仅具有左上角和左下角半径的圆形 UIButton【英文标题】:How to create rounded UIButton with top-left & bottom-left corner radius only 【发布时间】:2015-10-04 19:13:24 【问题描述】:

我需要创建一个具有左上角和左下角半径的按钮,例如。我尝试创建以下扩展名,该扩展名取自 *** 答案之一:

extension UIButton 

   func roundCorners(corners:UIRectCorner, radius: CGFloat) 
       self.layer.borderColor = GenerateShape.UIColorFromHex(0x989898, alpha: (1.0-0.3)).CGColor
       self.layer.borderWidth = 1.0
       let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
       let mask = CAShapeLayer()
       mask.path = path.CGPath
       self.layer.mask = mask

   

然后像这样调用方法:

self.collectionBtn.roundCorners(.TopLeft | .BottomLeft, radius: cornerRadius) 

此代码生成以下形状

那么为什么左上角和左下角不可见呢?我应该怎么做才能让它们可见?

【问题讨论】:

在应用mask之前尝试添加self.layer.masksToBounds = true。看起来您已经创建了一个矩形边框,然后切片了您需要的形状,但边框不是 maskingToBounds。 感谢您的建议。我使用@Duncan C 的解决方案。它对我有用。 请告诉我你不是在尝试滚动你自己的分段控件:-) 在这里查看我的答案:***.com/a/40222533/2594699 【参考方案1】:

您的代码正在为您的按钮应用遮罩层。这会导致您在遮罩层中安装的形状之外的任何东西都被遮盖掉。当您安装带有圆角的路径时,它基本上会“刮掉”两个角。这不是你想要的。

您可能希望创建一个形状图层并将其安装为按钮图层的常规子图层,而不是蒙版图层。但是,您需要将填充颜色设置为清除。

像这样更改您的代码:

extension UIButton 

  func roundCorners(corners:UIRectCorner, radius: CGFloat) 
  
    let borderLayer = CAShapeLayer()
    borderLayer.frame = self.layer.bounds
    borderLayer.strokeColor = GenerateShape.UIColorFromHex(0x989898, 
      alpha: (1.0-0.3)).CGColor
    borderLayer.fillColor = UIColor.clearColor().CGColor
    borderLayer.lineWidth = 1.0
    let path = UIBezierPath(roundedRect: self.bounds, 
      byRoundingCorners: corners, 
      cornerRadii: CGSize(width: radius, height: radius))
    borderLayer.path = path.CGPath
    self.layer.addSublayer(borderLayer);
  

编辑:

你设置角落的语法在 Swift 2 中不起作用:

self.collectionBtn.roundCorners(.TopLeft | .BottomLeft, radius: 10)

应该是

self.collectionBtn.roundCorners([.TopLeft, .BottomLeft], radius: 10)

【讨论】:

太棒了。效果很好。帮我个忙。我使用以下代码修改了代码以用灰色填充按钮:borderLayer.fillColor = UIColor.lightGrayColor().CGColor。这样可行。现在我需要将按钮标题颜色设置为白色。我使用以下代码:button.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)。但标题颜色不会改变。颜色仍然是我从情节提要中设置的灰色。你能告诉我为什么它没有改变吗?? 在问题末尾发布设置按钮颜色的整个方法。什么是“按钮”? 在第一行 UIButton 扩展的 roundCorners() 方法中,我添加了以下代码:self.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal) borderLayer.fillColor = GenerateShape.UIColorFromHex(0x989898, alpha: (1.0-0.3)).CGColor 这是设置按钮颜色的代码 我在处理这段代码时遇到了一些问题。主要是,我的编译器在“self.layer.addSublayer(borderLayer.path)”行上给了我这个错误:“无法将 CGPath 类型的值转换为预期的参数类型 CGLayer”。有什么建议吗?【参考方案2】:

你可以这样做:

CGRect maskRect = CGRectMake(0.0, 0.0, CGRectGetWidth(<#something here#>), CGRectGetHeight(<#something here#>));
CAShapeLayer *maskLayer = [CAShapeLayer layer];
UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:maskRect
                                           byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerTopLeft)
                                                 cornerRadii:CGSizeMake(<#corner radius#>, <#corner radius#>)];
maskLayer.path = path.CGPath;
self.layer.mask = maskLayer;

【讨论】:

不。这将给出与 OPs 代码相同的结果。如果您想要按钮上的圆角,您不需要遮罩层,您需要一个作为常规子层的形状层。 仔细看看。这是一个CAShapeLayer 是的,但是您将形状图层安装为按钮图层的蒙版,这不会产生所需的结果。尝试一下。它不会像你想象的那样工作。看我的回答。

以上是关于如何创建仅具有左上角和左下角半径的圆形 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

拐角半径仅在特定拐角处

如何删除具有圆形背景的`AppBarLayout`角落中的空白

具有圆形内边缘的方形布局边框

方形布局边框与圆形内边缘

border-radius四个值的问题

像在绘图应用程序中一样指定具有角半径的 UIBezierPath 点(例如 Sketch)