Кривая, которую я создал, не такая, как я предполагал:
это то, к чему я стремлюсь
это то, чего я достиг до сих пор:
class ConerViewBootomRight: UIView {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
//This method does the necessary UI adjustments
func setup()
{
if #available(iOS 13.0, *) {
let cornerRadius: CGFloat = 80.0 // Set the corner radius
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: self.bounds.width, y: 0))
path.addLine(to: CGPoint(x: self.bounds.width, y: self.bounds.height - cornerRadius))
path.addQuadCurve(to: CGPoint(x: self.bounds.width - cornerRadius, y: self.bounds.height), controlPoint: CGPoint(x: self.bounds.width, y: self.bounds.height))
path.addLine(to: CGPoint(x: 0, y: self.bounds.height))
path.close()
let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
self.layer.mask = maskLayer
}
}
}
Пожалуйста, помогите мне, я новичок в Swift.
Вы вызываете setup
в инициализаторах. Это означает, что все обращения к self.bounds.width
и self.bounds.height
будут оцениваться в любых размерах, которые изначально имеет bounds
представления. Если границы представления изменятся позже (например, будут установлены ограничениями AutoLayout), созданный вами путь по-прежнему будет использовать старую ширину и высоту.
Вам следует создать путь в layoutSubviews
, чтобы каждый раз при размещении представления создавался новый путь (что потенциально может дать ему другой bounds
).
class ConerViewBootomRight: UIView {
var maskLayer: CAShapeLayer!
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
setup()
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
func setup()
{
maskLayer = CAShapeLayer()
self.layer.mask = maskLayer
}
override func layoutSubviews() {
super.layoutSubviews()
let cornerRadius: CGFloat = 80.0
let path = UIBezierPath()
path.move(to: CGPoint(x: 0, y: 0))
path.addLine(to: CGPoint(x: self.bounds.width, y: 0))
path.addLine(to: CGPoint(x: self.bounds.width, y: self.bounds.height - cornerRadius))
path.addQuadCurve(to: CGPoint(x: self.bounds.width - cornerRadius, y: self.bounds.height), controlPoint: CGPoint(x: self.bounds.width, y: self.bounds.height))
path.addLine(to: CGPoint(x: 0, y: self.bounds.height))
path.close()
maskLayer.path = path.cgPath
}
}