Почему мой теневой слой расположен неправильно? - PullRequest
0 голосов
/ 26 апреля 2018

Я получил пользовательский подкласс UIView с именем RoundedView:

import UIKit

@IBDesignable
class RoundedView: UIView {

    @IBInspectable var shadowColor : UIColor? {
        didSet {
            layer.shadowColor = shadowColor?.cgColor
            layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        }
    }

    @IBInspectable var shadowOffset : CGSize = CGSize(width: 20, height: 20) {
        didSet {
            layer.shadowOffset = shadowOffset
            layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        }
    }

    @IBInspectable var shadowRadius : CGFloat = 0.0 {
        didSet {
            layer.shadowRadius = shadowRadius
            layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        }
    }

    @IBInspectable var shadowOpacity : Float = 1.0 {
        didSet {
            layer.shadowOpacity = shadowOpacity
            layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath
        }
    }


}

С этим классом я хочу иметь возможность установить тень для вида с помощью Xcode Interface Builder. К сожалению, поведение довольно странное; при установке цвета на синий, смещении на CGSize.zero, радиусе на 0 и непрозрачности на 1, вся тень перемещается вправо:

Это выходные данные 1. shadowPath, 2. границ и 3. фрейма:

shadowPath: 
    Path 0x60800022e040:
      moveto (0, 0)
        lineto (300, 0)
        lineto (300, 150)
        lineto (0, 150)
        closepath
self.bounds: 
    (0.0, 0.0, 300.0, 150.0)
self.frame: 
    (37.0, 268.5, 300.0, 150.0)

Понятия не имею, почему это происходит. Не могли бы вы помочь мне?

1 Ответ

0 голосов
/ 26 апреля 2018

Я не могу просто поставить эту строку

layer.shadowPath = UIBezierPath(rect: self.bounds).cgPath

в каждом обозревателе didSet, так как фрейм все еще может измениться.

Решено путем переопределения функции layoutSubviews и добавления туда строки.

...