У меня есть простой вид (левая часть изображения), и мне нужно создать какое-то наложение (правая часть изображения) на это представление. Этот оверлей должен иметь некоторую непрозрачность, чтобы изображение ниже было частично видно. Самое главное, что это наложение должно иметь круглое отверстие в середине, чтобы оно не перекрывало центр обзора (см. Рисунок ниже).
Я легко могу создать такой круг:
int radius = 20; //whatever
CAShapeLayer *circle = [CAShapeLayer layer];
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0,radius,radius) cornerRadius:radius].CGPath;
circle.position = CGPointMake(CGRectGetMidX(view.frame)-radius,
CGRectGetMidY(view.frame)-radius);
circle.fillColor = [UIColor clearColor].CGColor;
И "полный" прямоугольный оверлей вроде этого:
CAShapeLayer *shadow = [CAShapeLayer layer];
shadow.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, view.bounds.size.width, view.bounds.size.height) cornerRadius:0].CGPath;
shadow.position = CGPointMake(0, 0);
shadow.fillColor = [UIColor grayColor].CGColor;
shadow.lineWidth = 0;
shadow.opacity = 0.5;
[view.layer addSublayer:shadow];
Но я понятия не имею, как объединить эти два слоя, чтобы они создавали нужный мне эффект. Кто угодно? Перепробовала реально все ... Большое спасибо за помощь!
ios
objective-c
calayer
quartz-core
animal_chin
источник
источник
moveToPoint
затем добавьте прямоугольник с закругленными углами. Проверьте документацию на методы, предлагаемыеUIBezierPath
.Ответы:
Я смог решить эту проблему с помощью предложения Джона Стейнмеца. Если кому-то интересно, вот окончательное решение:
Swift 3.x:
Swift 4.2 и 5:
источник
Чтобы создать этот эффект, я обнаружил, что проще всего создать весь вид, перекрывающий экран, а затем вычесть части экрана, используя слои и UIBezierPaths. Для реализации Swift:
Я протестировал приведенный выше код, и вот результат:
Я добавил в CocoaPods библиотеку, которая абстрагирует большую часть приведенного выше кода и позволяет легко создавать наложения с прямоугольными / круглыми отверстиями, позволяя пользователю взаимодействовать с представлениями за наложением. Я использовал его для создания этого руководства для одного из наших приложений:
Библиотека называется TAOverlayView , и ее исходный код открыт под Apache 2.0. Надеюсь, вы найдете это полезным!
источник
Принятое решение Совместимость со Swift 3.0
источник
Я использовал тот же подход, что и animal_chin, но я более нагляден, поэтому я установил большую часть его в Interface Builder, используя розетки и автоматический макет.
Вот мое решение в Swift
источник
Совместимость с Code Swift 2.0
Начиная с ответа @animal_inch, я кодирую небольшой служебный класс, надеюсь, он оценит:
Затем в любом месте вашего кода:
источник