Главное, где вы вызываете applyDesign.Когда представление загружено, оно обычно имеет размер, полученный из метода nib / init.Поэтому, если вы примените дизайн тогда, он может не соответствовать тому, что будет на экране позже.
В вашем случае, вам следует повторно применять этот нестандартный дизайн каждый раз, когда текстовое поле размечается механизмом автоматической разметки .
Краткий пример того, как это может выглядеть:
class CustomField: UITextField {
lazy var innerShadow: CALayer = {
let innerShadow = CALayer()
layer.addSublayer(innerShadow)
return innerShadow
}()
override func layoutSubviews() {
super.layoutSubviews()
applyDesign()
}
func applyDesign() {
innerShadow.frame = bounds
// Shadow path (1pt ring around bounds)
let radius = self.frame.size.height/2
let path = UIBezierPath(roundedRect: innerShadow.bounds.insetBy(dx: -1, dy:-1), cornerRadius:radius)
let cutout = UIBezierPath(roundedRect: innerShadow.bounds, cornerRadius:radius).reversing()
path.append(cutout)
innerShadow.shadowPath = path.cgPath
innerShadow.masksToBounds = true
// Shadow properties
innerShadow.shadowColor = UIColor.darkGray.cgColor
innerShadow.shadowOffset = CGSize(width: 0, height: 2)
innerShadow.shadowOpacity = 0.5
innerShadow.shadowRadius = 2
innerShadow.cornerRadius = self.frame.size.height/2
}
}
Вы можете немного улучшить его, переместив некоторую избыточную настройку из applyDeisgn
в какой-то одноразовый инициализатор (даже в этомленивое определение).