我在堆栈视图中有两个按钮。我使用了UIButton的扩展来绕过外角。这适用于我在故事板中设计的7Plus,但是当我在模拟器中运行较小的设备尺寸时它停止工作,我只能在任一按钮的左侧而不是右边的角落。有什么想法吗?
这些是我使用
的扩展程序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
答案 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 强>
图层中任何延伸到其边界外的子图层都将被剪裁到这些边界。在这种情况下,将层视为其子层的窗口;窗口边缘以外的任何东西都不可见。 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
答案 1 :(得分:0)
答案 2 :(得分:0)
你可以尝试一种不同的,非常简单的方法来弯曲UIButton或Label上的角落。
答案 3 :(得分:0)
这很容易解决。我只需要在viewWillLayoutSubviews中围绕角落。
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
loginBtn.roundOneSide(topCorner: .topLeft, bottomCorner: .bottomLeft)
facebookBtn.roundOneSide(topCorner: .topRight, bottomCorner: .bottomRight)
}