使用约束约束时按钮的角落不会保持圆角

时间:2017-05-05 04:25:41

标签: ios iphone xcode swift3 uibutton

我在堆栈视图中有两个按钮。我使用了UIButton的扩展来绕过外角。这适用于我在故事板中设计的7Plus,但是当我在模拟器中运行较小的设备尺寸时它停止工作,我只能在任一按钮的左侧而不是右边的角落。有什么想法吗?

在7Plus上 enter image description here

在7上 enter image description here

这些是我使用

的扩展程序
extension CGSize{
    init(_ width:CGFloat,_ height:CGFloat) {
        self.init(width:width,height:height)
    }
}
extension UIButton{
    func roundOneSide(topCorner: UIRectCorner, bottomCorner: UIRectCorner){
        let maskPAth1 = UIBezierPath(roundedRect: self.bounds,
                                 byRoundingCorners: [topCorner , bottomCorner],
                                 cornerRadii:CGSize(6.0, 6.0))
        let maskLayer1 = CAShapeLayer()
        maskLayer1.frame = self.bounds
        maskLayer1.path = maskPAth1.cgPath
        self.layer.mask = maskLayer1
    }
}

我也试过以下代码无济于事。当约束发挥作用时,它只能成功地绕过左边的角落。

    let maskLayer = CAShapeLayer()
    maskLayer.path = UIBezierPath(roundedRect: view.bounds, byRoundingCorners: [.topLeft, .bottomRight], cornerRadii: CGSize(width: 6, height: 6)).cgPath
    facebookBtn.layer.mask = maskLayer
    facebookBtn.layer.masksToBounds = true

4 个答案:

答案 0 :(得分:1)

使用段控制作为生涩说或 请尝试以下代码:

//登录按钮

   UIBezierPath *cornersPathLeft = [UIBezierPath bezierPathWithRoundedRect:buttonLogin.bounds  byRoundingCorners:(UIRectCornerBottomLeft|
UIRectCornerTopLeft) cornerRadii:CGSizeMake(5, 5)];

    //Create a new layer to use as a mask

    CAShapeLayer *maskLayerLeft = [CAShapeLayer layer];

    // Set the path of the layer 

    maskLayerLeft.path = cornersPathLeft.CGPath;
    buttonLogin.layer.mask = maskLayerLeft;

//对于FB按钮

    UIBezierPath *cornersPathRight = [UIBezierPath bezierPathWithRoundedRect:buttonFB.bounds  byRoundingCorners:(UIRectCornerTopRight|
UIRectCornerBottomRight) cornerRadii:CGSizeMake(5, 5)];

    CAShapeLayer *maskLayerRight = [CAShapeLayer layer];
    maskLayerRight.path = cornersPathRight.CGPath;
    buttonFB.layer.mask = maskLayerRight;

注意:

执行maskToBounds = true它允许在图层上生效。

-

MaskToBounds和ClipsToBounds之间的区别

<强> MaskToBounds

图层中任何延伸到其边界外的子图层都将被剪裁到这些边界。在这种情况下,将层视为其子层的窗口;窗口边缘以外的任何东西都不可见。 masksToBounds = NO时,不会发生削波。

当此属性的值为true时,Core Animation会创建一个与图层边界匹配的隐式剪切蒙版,并包含任何角半径效果。如果还指定了mask属性的值,则将两个掩码相乘以获得最终的掩码值。

<强> ClipsToBounds

clipsToBounds的用例更适用于部分位于主视图之外的子视图。

例如,我在其父(矩形)UIView的边缘有一个(圆形)子视图。如果将clipsToBounds设置为YES,则只显示一半圆/子视图。如果设置为NO,则整个圆圈将显示。刚遇到这个就想分享

<强>结论

MaskToBounds 适用于任何视图的子图层。像这里OP添加了图层按钮,但它不会产生效果。我的意思是图层没有正确绑定。

ClipToBounds 应用于任何视图的子视图。假设你有一个视图(说,viewBG),现在你添加了另一个视图(说,upperView),现在你不想看到视图上部看到viewBG外面。 ViewUpper总是在其superview中。所以在这种情况下你必须使用clipstobounds。

实践经验

在swift

中尝试以下代码
let viewBG : UIView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        viewBG.backgroundColor = UIColor.lightGray

        self.view.addSubview(viewBG)

        let viewUpper : UIView = UIView(frame: CGRect(x: -50, y: -50, width: 100, height: 100))
        viewUpper.backgroundColor = UIColor.blue
        viewBG.addSubview(viewUpper)

<强>输出 1.当我完成viewBG.clipsToBounds = false

enter image description here

  1. 当我完成viewBG.clipsToBounds = true
  2. enter image description here

答案 1 :(得分:0)

您需要在故事板中启用按钮的clipToBound属性;

enter image description here

答案 2 :(得分:0)

你可以尝试一种不同的,非常简单的方法来弯曲UIButton或Label上的角落。

  1. 点击按钮
  2. 点击身份检查员
  3. 然后在标识部分
  4. 中添加一个属性
  5. 密钥路径为layer.cornerRadius
  6. 设为数字
  7. 最后给出一个值,值越高,角落越圆。
  8. layer.cornerRadius

答案 3 :(得分:0)

这很容易解决。我只需要在viewWillLayoutSubviews中围绕角落。

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    loginBtn.roundOneSide(topCorner: .topLeft, bottomCorner: .bottomLeft)
    facebookBtn.roundOneSide(topCorner: .topRight, bottomCorner: .bottomRight)
}