作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
<分区>
在我的应用程序中,我有一个正方形 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,深蓝色是背景):
但这是我得到的。 (无论我尝试什么,每一次)
除了制作一个形状已经完全符合我需要的面具之外,我不确定如何实现这一点。但如果我能够做到这一点,那么我一开始就不会遇到这个问题。有没有人对如何实现这一目标有任何提示?
编辑: 这个问题应该是我已经尝试过但无法开始工作的副本。也许我做错了或者在错误的上下文中使用它。我不熟悉任何给定的方法,而且指针的使用使它看起来有点过时。接受的答案更好地解释了如何使用更广泛使用的 UIBezierPaths 以及在自定义 UIView 的上下文中实现这一点。
我是一名优秀的程序员,十分优秀!