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

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

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

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

введите описание изображения здесь

(Без чего-либо, отображаемого внутри круга в целях отладки)

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

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


person Eliza Wilson    schedule 19.08.2014    source источник


Ответы (1)


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

CircleControlView *circleView = yourCircleView();

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

ОБНОВИТЬ

Пример быстрой игровой площадки:

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

Результат:

полупрозрачный круг

person rob mayoff    schedule 19.08.2014
comment
Стоит отметить, что я смог заставить это работать, только когда UIVisualEffectView отключена вибрация. Если я включаю вибрацию, маска явно игнорируется. - person Benjohn; 26.09.2014
comment
@Benjohn Моя круглая маска по-прежнему отлично работает, когда в представлении визуальных эффектов включена яркость. Кажется странным, что ваша маска не работает, когда включена вибрация. Я думаю, это должно быть вызвано чем-то другим. - person Eliza Wilson; 05.11.2014
comment
Привет, @ E.A. Wilson, спасибо - ты прав, я неправильно использовал вибрацию :-) - person Benjohn; 05.11.2014
comment
Можно ли это сделать с другим изображением? Скажем, у меня есть изображение стрелки, и я хочу, чтобы эффекты UIEffectsView применялись только к изображению. Как мне применить этот код к этому? - person Jacob; 19.02.2016
comment
Я не понимаю, о чем вы просите, но это звучит достаточно по-другому, поэтому это должен быть отдельный вопрос. - person rob mayoff; 19.02.2016