В моем приложении у меня есть квадрат UIView, и я хочу вырезать отверстие/выемку из верхней части. Все обучающие онлайн-игры все одинаковы и кажутся довольно простыми, но каждый из них всегда доставлял полную противоположность тому, что я хотел.Вырезать круг из UIView с использованием маски
Например это код для пользовательского UIView:
class BottomOverlayView: UIView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
drawCircle()
}
fileprivate func drawCircle(){
let circleRadius: CGFloat = 80
let topMidRectangle = CGRect(x: 0, y: 0, width: circleRadius*2, height: circleRadius*2)
let circle: CAShapeLayer = CAShapeLayer()
circle.position = CGPoint(x: (frame.width/2)-circleRadius, y: 0-circleRadius)
circle.fillColor = UIColor.black.cgColor
circle.path = UIBezierPath(ovalIn: topMidRectangle).cgPath
circle.fillRule = kCAFillRuleEvenOdd
self.layer.mask = circle
self.clipsToBounds = true
}
}
Вот что я надеюсь достичь (светло-голубой является UIView, темно-синий фон):
Но вот что я получаю вместо этого. (Каждый раз, независимо от того, что я стараюсь)
Я не знаю, как я бы добиться этого, кроме создания маски, которая уже точная форма, что мне нужно. Но если бы я смог это сделать, у меня не было бы этой проблемы в первую очередь. Есть ли у кого-нибудь советы о том, как этого достичь?
EDIT: Вопрос, что это, предположительно, дубликат, я уже пытался и не смог получить работу. Возможно, я делал это неправильно или использовал его в неправильном контексте. Я не был знаком ни с одним из этих методов, а использование указателей показалось ему немного устаревшим. В принятом ответе гораздо лучше объясняется, как это можно реализовать с использованием гораздо более широко используемых UIBezierPaths, а также в контексте пользовательского UIView.
Reilem - Он работает, если вы хотите использовать два пути Мэтта с четным правилом заполнения, чтобы нарисовать путь всего, что не замаскировано. Я лично считаю, что это противоречит интуиции, когда я могу просто нарисовать путь маски, но каждому свой. Во всяком случае, я обновил свой ответ обеими подходами. – Rob