在日常開發(fā)中有時候我們需要在APP中做用戶指導老虫,比如第一次進入某個頁面的時候顯示遮罩覆蓋烫沙, 但是又需要將遮罩下的某些區(qū)域暴露出來镣隶,便于文字說明漫试,比如我們需要在視圖上加個遮罩六敬,并且遮罩上要顯示 按鈕2 :
期待的效果圖:按鈕1被蓋住,而 按鈕2顯示出來
我們可以 在視圖上加個遮罩驾荣,再往遮罩上畫一個同樣位置和樣式的 按鈕2 外构,作為一個有追求的程序猿,我們是不能容忍這種 低效實現(xiàn)方式的播掷。
我們可以通過iOS 的 Core Graphics 來實現(xiàn)审编,也很簡單,只需要兩句代碼
重寫 遮罩視圖里面的 draw 方法:
override func draw(_ rect: CGRect) {
//利用 UIBezierPath 繪制出 按鈕2 的外觀路徑,
let path = UIBezierPath.init(roundedRect: CGRect.init(x: 100, y: 300, width: 100.0, height: 40.0), cornerRadius: 20.0)
//設(shè)置 路徑填充樣式為 clear 清除樣式歧匈, 就能 使設(shè)置的路徑中的 繪圖區(qū)域被擦除掉
path.fill(with: .clear, alpha: 0.1)
}
點擊穿透:
如果我們需要在遮罩上點擊按鈕2 區(qū)域響應(yīng) 按鈕2的事件垒酬,點擊其它區(qū)域響應(yīng)遮罩上的點擊事件,我們可以重寫 遮罩上的 事件傳遞方法hitTest:
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
//按鈕2區(qū)域的路徑
let path = UIBezierPath.init(roundedRect: CGRect.init(x: 100, y: 300, width: 100.0, height: 40.0), cornerRadius: 20.0)
//判斷 點擊事件在 按鈕2區(qū)域則 返回nil
if path.contains(point) {
return nil
}else{
return super.hitTest(point, with: event)
}
}