#ios #swift #core-graphics #uibezierpath
#iOS #swift #ядро-графика #uibezierpath
Вопрос:
Я хочу иметь представление, которое внизу имеет кривую.
Я создал это ArchView
, которое отлично справляется с задачей, за исключением одной вещи: синяя часть, я хочу, чтобы она была прозрачной.
Если я установлю цвет фона так, как .clear
это произойдет:
Это код для ArchView
:
class ArchedView: UIView {
let archHeight: CGFloat
let bColor: UIColor
let archColor: UIColor
let contentView: UIView = UIView()
init(archHeight: CGFloat, bColor: UIColor, archColor: UIColor) {
self.archHeight = archHeight
self.bColor = bColor
self.archColor = archColor
super.init(frame: .zero)
backgroundColor = .clear
addSubview(contentView)
contentView.backgroundColor = bColor
contentView.snp.makeConstraints { (make) in
make.top.left.right.equalToSuperview()
make.bottom.equalToSuperview().offset(-archHeight)
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func draw(_ rect: CGRect) {
let height: CGFloat = archHeight
let ovalRect = CGRect(x: 0, y: 0, width: frame.width, height: height)
let ovalPath = UIBezierPath()
ovalPath.addArc(withCenter: CGPoint(x: 0, y: 0), radius: (ovalRect.width / 2) * 1.3, startAngle: 180 * .pi/180, endAngle: 0 * .pi/180, clockwise: false)
ovalPath.addLine(to: CGPoint.zero)
ovalPath.close()
var ovalTransform = CGAffineTransform(translationX: ovalRect.midX, y: frame.height - height)
ovalTransform = ovalTransform.scaledBy(x: 1, y: height / ovalPath.bounds.height)
ovalPath.apply(ovalTransform)
archColor.setFill()
ovalPath.fill()
}
}
Я предполагаю, что это как-то связано с fill()
, но я не могу понять, что здесь происходит.
Комментарии:
1. Проверьте свой вид.цвет фона
2. @ReinierMelian Я не уверен, что понимаю вас, какой вид.цвет фона? Это UIView, а не UIViewController.
3. ваш цвет фона понятен,
backgroundColor = .clear
4. Почему бы вместо этого не использовать слой маски?