Добавление тени в UIView в альбомном и портретном режимах - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь добавить тень на UIView.Вот мой код для добавления тени.

func addDropShadow() {
    layer.cornerRadius = 5.0
    layer.masksToBounds = false
    layer.shadowColor = UIColor.darkGray.cgColor
    layer.shadowOpacity = 0.5
    layer.shadowOffset = CGSize(width: 2, height: 2)
    layer.shadowRadius = 4

    layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    layer.shouldRasterize = true
    layer.rasterizationScale = UIScreen.main.scale
}

Работает нормально, если устройство находится в портретном режиме, но в ландшафтном режиме тень либо обрезается

Portrait Image

Когда я снова поворачиваю устройство, чтобы ландшафтная тень не двигалась за пределы экрана.

Portrait Image

Я думал, что это может быть связано сСмена ориентации кадра зрения также обновляется.Поэтому я обновил свойство теневого пути в методе viewDidLayoutSubviews.Но поведение остается прежним.

Вот мой код

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.dropShadowView.layer.shadowPath = UIBezierPath(rect: self.dropShadowView.bounds).cgPath
}

Я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 23 января 2019

Вам будет намного легче управлять тенью, если вы сделаете этот подкласс UIView и переопределите layoutSubviews():

@IBDesignable
class SimpleShadowedView: UIView {

    override func layoutSubviews() {
        super.layoutSubviews()

        layer.cornerRadius = 5.0
        layer.masksToBounds = false
        layer.shadowColor = UIColor.darkGray.cgColor
        layer.shadowOpacity = 0.5
        layer.shadowOffset = CGSize(width: 2, height: 2)
        layer.shadowRadius = 4

        layer.shadowPath = UIBezierPath(rect: bounds).cgPath
        layer.shouldRasterize = true
        layer.rasterizationScale = UIScreen.main.scale

    }
}

Обратите также внимание, что, добавив обозначение @IBDesignable, вы также можете увидеть результат во время разработки.

Установите пользовательский класс вашего представления в Storyboard / Interface Builder на SimpleShadowedView:

enter image description here

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

enter image description here

enter image description here

Если вы выберете Editor -> Refresh All Views (или Automatically Refresh Views), вы также увидите его во время разработки.

enter image description here

...