Чтобы создать этот эффект, мне было проще всего создать весь вид, перекрывающий экран, а затем вычитая части экрана с помощью слоев и UIBezierPaths. Для реализации Swift:
// Create a view filling the screen.
let overlay = UIView(frame: CGRectMake(0, 0,
UIScreen.mainScreen().bounds.width,
UIScreen.mainScreen().bounds.height))
// Set a semi-transparent, black background.
overlay.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.85)
// Create the initial layer from the view bounds.
let maskLayer = CAShapeLayer()
maskLayer.frame = overlay.bounds
maskLayer.fillColor = UIColor.blackColor().CGColor
// Create the frame for the circle.
let radius: CGFloat = 50.0
let rect = CGRectMake(
CGRectGetMidX(overlay.frame) - radius,
CGRectGetMidY(overlay.frame) - radius,
2 * radius,
2 * radius)
// Create the path.
let path = UIBezierPath(rect: overlay.bounds)
maskLayer.fillRule = kCAFillRuleEvenOdd
// Append the circle to the path so that it is subtracted.
path.appendPath(UIBezierPath(ovalInRect: rect))
maskLayer.path = path.CGPath
// Set the mask of the view.
overlay.layer.mask = maskLayer
// Add the view so it is visible.
self.view.addSubview(overlay)
Я проверил код выше, и вот результат:
Я добавил библиотека CocoaPods, которая абстрагирует многие из вышеуказанного кода и позволяет легко создавать наложения с прямоугольными / круглыми отверстиями, позволяя пользователю взаимодействовать с представлениями за наложением. Я использовал его для создания этого учебника для одного из наших приложений:
[/g2]
Библиотека называется TAOverlayView и открыта источник под Apache 2.0. Надеюсь, вы сочтете это полезным!