Как установка тени CALayer нарушает ограничения AutoLayout? - PullRequest
0 голосов
/ 27 апреля 2020

У меня есть настройка теней imageView ячейки:

override func layoutSubviews() {
    moviePosterImageView.layer.shadowOffset = .zero
    moviePosterImageView.layer.shadowColor = UIColor.black.cgColor
    moviePosterImageView.layer.shadowRadius = 5
    moviePosterImageView.layer.shadowOpacity = 1
    moviePosterImageView.layer.masksToBounds = false
    moviePosterImageView.layer.shadowPath = UIBezierPath(rect: moviePosterImageView.bounds).cgPath
}

Но это нарушает размеры и ограничения imageView. Без тени это работает довольно хорошо.

enter image description here

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Но это нарушает размеры и ограничения imageView.

Да, потому что вы забыли начать с того, что сказали

override func layoutSubviews() {
    super.layoutSubviews() // important

Так как автоматическое расположение происходит в layoutSubviews, если вы не позвоните super, вы не сможете его запустить.

0 голосов
/ 27 апреля 2020

Используйте этот код в другом быстром файле и легко устанавливайте тень на доске историй или в xib

extension UIView {

@IBInspectable
var cornerRadius: CGFloat {
    get {
        return layer.cornerRadius
    }
    set {
        layer.cornerRadius = newValue
    }
}

@IBInspectable
var borderWidth: CGFloat {
    get {
        return layer.borderWidth
    }
    set {
        layer.borderWidth = newValue
    }
}

@IBInspectable
var borderColor: UIColor? {
    get {
        if let color = layer.borderColor {
            return UIColor(cgColor: color)
        }
        return nil
    }
    set {
        if let color = newValue {
            layer.borderColor = color.cgColor
        } else {
            layer.borderColor = nil
        }
    }
}

@IBInspectable
var shadowRadius: CGFloat {
    get {
        return layer.shadowRadius
    }
    set {
        layer.shadowRadius = newValue
    }
}

@IBInspectable
var shadowOpacity: Float {
    get {
        return layer.shadowOpacity
    }
    set {
        layer.shadowOpacity = newValue
    }
}

@IBInspectable
var shadowOffset: CGSize {
    get {
        return layer.shadowOffset
    }
    set {
        layer.shadowOffset = newValue
    }
}

@IBInspectable
var shadowColor: UIColor? {
    get {
        if let color = layer.shadowColor {
            return UIColor(cgColor: color)
        }
        return nil
    }
    set {
        if let color = newValue {
            layer.shadowColor = color.cgColor
        } else {
            layer.shadowColor = nil
        }
    }
  }
}
...