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