Я пытаюсь настроить вид с закругленными углами, но только с верхним левым и правым углом и с цветной рамкой. Это мой класс просмотров:
class PullUpOverview: UIVisualEffectView {
override init(effect: UIVisualEffect?) {
super.init(effect: effect)
let maskLayer = CAShapeLayer()
maskLayer.path = UIBezierPath(roundedRect: bounds,
byRoundingCorners: [.topRight, .topLeft],
cornerRadii: CGSize(width: 25, height: 25)).cgPath
layer.mask = maskLayer
let borderLayer = CAShapeLayer()
borderLayer.frame = bounds
borderLayer.path = maskLayer.path
borderLayer.lineWidth = 1
borderLayer.strokeColor = UIColor.gray.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
layer.addSublayer(borderLayer)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Я добавляю представление в свое представление viewController в методе viewDidLoad
следующим образом (overviewRect
настроен правильно):
let overview = PullUpOverview(effect: UIBlurEffect(style: UIBlurEffect.Style.extraLight))
overview.frame = overviewRect
self.mapView.addSubview(overview)
Но если я добавлю вид, ничего не появится. Если я изменю суперкласс PullUpOverview
на UIView и изменю свой код в методе viewDidLoad
на отслеживание представления, его маска будет добавлена и применена правильно (очевидно, эффект размытия отсутствует, поэтому я попытался сделать то же самое с и UIVisualEffectView
):
let overview = PullUpOverview(frame: overviewRect)
self.mapView.addSubview(overview)
Итак, что мне нужно изменить, чтобы получить UIVisualEffectView с двумя закругленными углами (оба верхних угла) и пограничным слоем?
size
- это zero
для bounds
, поэтому оба слоя не могут быть видны. Вы можете ввести собственный инициализатор, как показано ниже,
class PullUpOverview: UIVisualEffectView {
init(effect: UIVisualEffect?, size: CGSize) {
super.init(effect: effect)
let rect = CGRect(origin: .zero, size: size)
let maskLayer = CAShapeLayer()
maskLayer.path = UIBezierPath(roundedRect: rect,
byRoundingCorners: [.topRight, .topLeft],
cornerRadii: CGSize(width: 25, height: 25)).cgPath
maskLayer.frame = rect
layer.mask = maskLayer
let borderLayer = CAShapeLayer()
borderLayer.frame = rect
borderLayer.path = maskLayer.path
borderLayer.lineWidth = 1
borderLayer.strokeColor = UIColor.yellow.cgColor
borderLayer.fillColor = UIColor.clear.cgColor
layer.addSublayer(borderLayer)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
И теперь вы можете инициализировать и добавить этот view
как,
let overviewRect = CGRect(origin: CGPoint(x: 100, y: 200), size: CGSize(width: 200, height: 200))
let overview = PullUpOverview(effect: UIBlurEffect(style: .dark), size: overviewRect.size)
overview.frame = overviewRect
self.view.addSubview(overview)
Это приведет к следующему,