Swift: UIVisualEffectView с закругленными верхними краями и цветной рамкой - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь настроить вид с закругленными углами, но только с верхним левым и правым углом и с цветной рамкой.Это мой класс представлений:

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 с двумя закругленными углами (оба верхних угла) и пограничным слоем?

1 Ответ

0 голосов
/ 20 октября 2018

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)

Это приведет к следующему,

enter image description here

...