Представление отрисовки CoreGraphic на некоторое время исчезает после перехода приложения в фоновый режим - PullRequest
0 голосов
/ 11 сентября 2018

Вот код моего взгляда.

override func draw(_ rect: CGRect) {

    let path = self.getPath()

    path.stroke()
}

func getPath() -> UIBezierPath {

    let path = UIBezierPath()

    path.lineWidth = 1
    path.lineCapStyle = .round
    path.lineJoinStyle = .round
    mainColor.setStroke()
    mainColor.setFill()
    path.move(to: CGPoint(x:0,y:0))

    path.addQuadCurve(to: endPointLeft, controlPoint: controlPointLeft)
    path.addLine(to: startPointRight)
    path.addQuadCurve(to: endPointRight, controlPoint: controlPointRight)
    path.addLine(to: startPointLeft)

    path.fill()
    path.stroke()

    return path
}

Работает нормально.Но иногда после некоторого нахождения в фоновом режиме это представление исчезает.

***** Подробнее *****

В ViewController есть функция, которая изменяет прокруткувысота этого взгляда.После изменения ограничения высоты позвоните self.view.layoutIfNeeded().

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Причина:

После долгого пребывания в BG будет вызвана функция draw (), чтобы перерисовать View. И как будто высота обзора равна 0, он ничего не будет рисовать.

Решение:

Используйте CAShapeLayer для обновления пути.

@IBInspectable var mainColor: UIColor = UIColor.blue

private var bottomLayer : CAShapeLayer = CAShapeLayer()

override func awakeFromNib() {
    super.awakeFromNib()

    bottomLayer = CAShapeLayer()
    bottomLayer.strokeColor = mainColor.cgColor
    bottomLayer.fillColor = mainColor.cgColor
    bottomLayer.lineWidth = 1
    bottomLayer.backgroundColor = UIColor.clear.cgColor
    bottomLayer.path = self.getPath().cgPath

    self.layer.addSublayer(bottomLayer)
}

override func layoutSubviews() {
    super.layoutSubviews()

    self.bottomLayer.frame = self.bounds
    self.bottomLayer.path = self.getPath().cgPath
}
0 голосов
/ 11 сентября 2018

что вы можете сделать, это ретранслировать подпредставления, когда приложение стало активным для этого первого добавленного наблюдателя, как показано ниже в вашем контроллере

override func viewDidLoad() {
    super.viewDidLoad()
    NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)), name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
}

@objc func applicationDidBecomeActive(_ notification:Notification)
{
    self.view.layoutIfNeeded()
}

override func viewWillDisappear(_ animated: Bool) {
    NotificationCenter.default.removeObserver(self, name: NSNotification.Name.UIApplicationDidBecomeActive, object: nil)
}
...