Обновление теневого пути при изменении вращения устройства.Проблема с тенью - PullRequest
0 голосов
/ 21 марта 2019

У меня есть вид, который содержит другие виды.ViewforShadow -> View-> bottomBlueView

func setupMyView() {

    myView.layer.shadowColor = #colorLiteral(red: 0.2901960784, green: 0.2901960784, blue: 0.2901960784, alpha: 1)
    myView.layer.shadowOffset = CGSize.zero
    myView.layer.shadowRadius = 4
    myView.layer.shadowOpacity = 1
    myView.layer.masksToBounds = false
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath
    myView.layer.backgroundColor = UIColor.clear.cgColor

}

Всякий раз, когда я поворачиваю свое устройство, я получаю эту странную тень

shadow

Я понимаючто эта проблема возникает, потому что тень имеет myView.bounds для портретного / ландшафтного режима.Поэтому мне нужно менять его всякий раз, когда я поворачиваю свое устройство.Я обнаружил, что viewWillLayoutSubviews () и viewDidLayoutSubviews () - отличные функции для решения моей проблемы.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    //update shadow
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath

}

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
    //update shadow
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath

}

Я пробовал и то и другое, и оно отлично работает, но всякий раз, когда я поворачиваю свое устройство в течение примерно 1 секунды, возникает эта глючная тень (мне это не нравится)Через 1 секунду

EDIT Я решил создать новый пустой проект и посмотреть, почему он не работает.У меня есть 1 UIView внутри моего контроллера View и этот код.

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
    super.viewDidLoad()

    setupMyView()
}

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    //update shadow
    myView.frame = myView.frame
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath

}

func setupMyView() {
    myView.layer.shadowColor = #colorLiteral(red: 0.2745098174, green: 0.4862745106, blue: 0.1411764771, alpha: 1)
    myView.layer.shadowOffset = CGSize.zero
    myView.layer.shadowRadius = 4
    myView.layer.shadowOpacity = 1
    myView.layer.masksToBounds = false
    myView.layer.shadowPath = UIBezierPath(roundedRect: myView.bounds, cornerRadius: myView.frame.height / 10).cgPath
 //   myView.layer.backgroundColor = UIColor.clear.cgColor
}

} Когда вы поворачиваете устройство, тень находится не в правильном положении.shadowproblem

через 1 секунду выглядит хорошо (нормальное состояние) normalstate

1 Ответ

0 голосов
/ 21 марта 2019

Вы можете попробовать настроить ViewForShadow следующим образом:

в ViewController:

    fileprivate func setupMyView() {
        viewForShadow.layer.shadowColor = #colorLiteral(red: 0.2901960784, green: 0.2901960784, blue: 0.2901960784, alpha: 1)
        viewForShadow.layer.shadowOffset = CGSize.zero
        viewForShadow.layer.shadowRadius = 4
        viewForShadow.layer.shadowOpacity = 1
        viewForShadow.backgroundColor = .clear
    }

Как видите без shadowPath.

WhiteView (вид, который содержит bottomBlueView) будет иметь несколько настроек радиуса угла:

    fileprivate func setupWhiteView() {
        whiteView.layer.cornerRadius = 5.0
        whiteView.layer.masksToBounds = true
    }

Этого должно быть достаточно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...