我在堆栈视图中有两个按钮。我使用了UIButton的扩展来解决外部问题。这适用于我在情节提要中设计的7Plus,但是一旦我在模拟器中以较小的设备尺寸运行时,它就会停止工作,并且我只能在任一按钮的左侧而不是右侧进行圆角操作。有任何想法吗?

在7Plus上
ios - 使用约束约束时,按钮的角不会保持圆角-LMLPHP

在7
ios - 使用约束约束时,按钮的角不会保持圆角-LMLPHP

这些是我正在使用的扩展

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

最佳答案

如您所说的那样使用段控制
试试下面的代码:

//用于登录按钮

   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,则仅显示一半的圆/子视图。如果设置为“否”,则将显示整个圆圈。刚遇到这个所以想分享

结论

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

ClipToBounds应用于任何视图的子视图。假设您有一个视图(说viewBG),现在又添加了另一个视图(例如upperView),现在您不想看到上部视图就可以看到viewBG之外。 ViewUpper始终在其超级视图范围内。因此,在这种情况下,您必须将clipstobounds设为true。

实践经验

快速尝试以下代码

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

ios - 使用约束约束时,按钮的角不会保持圆角-LMLPHP


当我完成viewBG.clipsToBounds = true


ios - 使用约束约束时,按钮的角不会保持圆角-LMLPHP

08-26 04:02