Как использовать UIVisualEffectView внутри круга

Я создаю пользовательский круг управления. Часть круга может быть прозрачной. Это создало бы более визуальный смысл и выглядело бы лучше, если бы оно было прозрачным, а не прозрачным.

Поскольку представления являются прямоугольными, и я хочу, чтобы круг был полупрозрачным, а не остальным прямоугольником, это проблема.

UIVisualEffectView находится за настраиваемым элементом управления.

enter image description here

(Без каких-либо результатов внутри круга для целей отладки)

Как вы можете видеть, вид размывает объекты вне круга.

Я не знаю, как размыть внутри только представление, а предварительная документация практически пуста. Моя единственная мысль - создать много просмотров 1x1, чтобы охватить круг, но похоже, что это не будет работать, и даже если бы это было сделано, это было бы медленным и уродливым решением. Как я могу размыть содержимое внутри представления, не размывая ничего за его пределами?

Ответ 1

Установите маску слоя вида круга на заполненный круг:

CircleControlView *circleView = yourCircleView();

CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = [UIBezierPath bezierPathWithOvalInRect:circleView.bounds].CGPath;
circleView.layer.mask = mask;

UPDATE

Пример быстрой игры:

import UIKit
import XCPlayground
import QuartzCore

UIGraphicsBeginImageContext(CGSize(width: 100, height: 100))
let viewPath = UIBezierPath(ovalInRect:CGRect(x:1,y:1,width:98,height:98))
viewPath.lineWidth = 2
viewPath.stroke()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

let view = UIView(frame:CGRect(x:0,y:0,width:100,height:100))
XCPShowView("view", view)

let label = UILabel(frame:view.bounds)
label.text = "This is the text in the background behind the circle."
label.numberOfLines = 0
view.addSubview(label)

let effectView = UIVisualEffectView(effect:UIBlurEffect(style:.ExtraLight))
effectView.frame = view.bounds
view.addSubview(effectView)

let circleView = UIImageView(image:image)
effectView.addSubview(circleView)

let maskPath = UIBezierPath(ovalInRect:circleView.bounds)
let mask = CAShapeLayer()
mask.path = maskPath.CGPath
effectView.layer.mask = mask

Результат:

translucent circle