Отрегулируйте положение слоя с прозрачным отверстием при изменении вида с портрета на ландшафт - PullRequest
0 голосов
/ 27 сентября 2018

Я использую этот код для создания слоя с прозрачным отверстием

let radius = min(self.view.frame.size.width,self.view.frame.size.height)
    print(radius)
    let path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height), cornerRadius: 0)
    let circlePath = UIBezierPath(roundedRect: CGRect(x: 0, y: self.view.frame.size.height/2 - radius/2 , width: radius, height: radius), cornerRadius: radius/2)
    path.append(circlePath)

    path.usesEvenOddFillRule = true

    fillLayer.path = path.cgPath
    fillLayer.fillRule = kCAFillRuleEvenOdd
    fillLayer.fillColor = UIColor.black.cgColor
    fillLayer.opacity = 0.5
    view.layer.addSublayer(fillLayer)

, он отлично работает, если начальный вид - книжный или альбомный, как показано на изображении

enter image description here

Однако, если вид меняется с портретного на ландшафтный или ландшафтный на портретный

Слой неправильно ориентирован, как показано

enter image description here

1 Ответ

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

Похоже, вам нужно будет обновлять фрейм вашего пути всякий раз, когда пользователь поворачивает свое устройство.Вы ищете что-то вроде ответа здесь .

Если вам нужно анимировать вместе с переходом, попробуйте что-то вроде этого:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)
    coordinator.animate(alongsideTransition: { context in            
        // update frames here
    }, completion: nil)
}
...