2016-08-30 41 views
1

对于四舍五入某个角落,SO上有很多答案。我遇到的问题是我试图将按钮角落对齐下方视图的圆角。请参阅图片。黄色的视图四角四舍五入。我试图让右上角的关闭按钮与黄色视图的圆角对齐。我使用了下面的Swift 3代码,但按钮保持正方形。任何人都可以请指出缺少什么?按钮的圆角半径与下方的视图对齐

viewRaised是黄色的视图。

非常感谢!

let path = UIBezierPath(roundedRect: btnCancel.layer.bounds, byRoundingCorners:[.topRight, .bottomLeft], cornerRadii: CGSize(width: 10, height: 10)) 
let maskLayer = CAShapeLayer() 
maskLayer.path = path.cgPath 
btnCancel.layer.mask = maskLayer 
btnCancel.layer.masksToBounds = true 

self.viewRaised.layer.cornerRadius = 10 
self.viewRaised.layer.masksToBounds = false 
self.viewRaised.layer.shadowOffset = CGSize(width: 5, height: 10); 
self.viewRaised.layer.shadowRadius = 10; 
self.viewRaised.layer.shadowOpacity = 0.5; 

enter image description here

UPDATE:

有趣的是,同样的代码似乎是工作,但仅适用于左上角。看到第二个图像。

self.viewRaised.layer.cornerRadius = 10 
    self.viewRaised.layer.masksToBounds = false 
    self.viewRaised.layer.shadowOffset = CGSize(width: 5, height: 10); 
    self.viewRaised.layer.shadowRadius = 10; 
    self.viewRaised.layer.shadowOpacity = 0.5; 

    let path = UIBezierPath(roundedRect: btnCancel.layer.bounds, byRoundingCorners:[.allCorners], cornerRadii: CGSize(width: 10, height: 10)) 
    let maskLayer = CAShapeLayer() 
    maskLayer.path = path.cgPath 
    btnCancel.layer.mask = maskLayer 

这很令人困惑。我使用的XCode 8.0版测试版6(8S201h)

enter image description here

+1

你尝试夹到子视图? –

+0

如果该按钮是黄色视图的子视图,则应该按照它自己的方式工作。你不应该做任何事情。 –

+0

@MarcoSantarossa如果OP设置了“图层蒙版”,他们不需要启用“clipsToBounds”。此外,@尼基塔,将该按钮设置为其“图层蒙版”的“子视图”会导致崩溃。 – ZGski

回答

2
  1. btnCancel.layer.mask应设置为黄色视图
  2. 您需要添加btnCancel作为黄色视图的父母的子图层。

例(SWIFT 3.X):

let yellowView = UIView(frame: CGRectMake(20.0, 20.0, 200.0, 200.0)) 
yellowView.backgroundColor = UIColor.yellowColor() 
yellowView.layer.borderColor = UIColor.clearColor().CGColor 
yellowView.layer.borderWidth = 1.0 
yellowView.layer.cornerRadius = 10.0 
self.view.addSubview(yellowView) // Add yellowView to self's main view 

let btnCancel = UIView(frame: CGRectMake(20.0, 20.0, 45.0, 45.0)) 
btnCancel.backgroundColor = UIColor.redColor() 
btnCancel.layer.mask = yellowView.layer // Set btnCancel.layer.mask to yellowView.layer 
self.view.addSubview(btnCancel) // Add btnCancel to self's main view, NOT yellowView 

注:

你并不需要启用clipsToBounds因为你设置的掩模层。您也不需要为掩码创建新的CAShapeLayer。使用yellowView的图层作为蒙版。

斯威夫特4.x版:

let yellowView = UIView(frame: CGRect(x: 20.0, y: 20.0, width: 200.0, height: 200.0)) 
yellowView.backgroundColor = .yellow 
yellowView.layer.borderColor = UIColor.clear.cgColor 
yellowView.layer.borderWidth = 1.0 
yellowView.layer.cornerRadius = 10.0 
self.view.addSubview(yellowView) // Add yellowView to self's main view 

let btnCancel = UIView(frame: CGRect(x: 20.0, y: 20.0, width: 45.0, height: 45.0)) 
btnCancel.backgroundColor = .red 
btnCancel.layer.mask = yellowView.layer // Set btnCancel.layer.mask to yellowView.layer 
self.view.addSubview(btnCancel) // Add btnCancel to self's main view, NOT yellowView 
+0

谢谢ZGski。如果通过故事板将视图(包括黄色和按钮)添加到主视图(即没有addSubview),这会如何更改。 –

+0

我将此添加到代码btnCancel.layer.mask = self.viewRaised.layer,它不起作用。 –

+0

你必须确保你的'btnCancel' _is不是你黄色视图的子视图,而是黄色视图父视图的子视图。 – ZGski

0

所有我需要做的是删除整个的这一点。但它工作,如果我只删除粗体行。但是由于取消按钮是黄色视图的子视图,因此其余行不再需要。

let path = UIBezierPath(roundedRect: btnCancel.layer.bounds, byRoundingCorners:[.topRight, .bottomLeft], cornerRadii: CGSize(width: 10, height: 10)) 
let maskLayer = CAShapeLayer() 
maskLayer.path = path.cgPath 
btnCancel.layer.mask = maskLayer 

btnCancel.layer.masksToBounds =真