2016-08-30 67 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 =真