Пользовательское закругленное текстовое поле с внутренними тенями не получает правильное расположение - PullRequest
0 голосов
/ 25 февраля 2019

Я хочу создать текстовое поле с вложенными тенями.

Я нашел ответ здесь , но я не получил ожидаемого результата, потому что у меня недостаточно кармы и я не могуДобавить комментарий.

Вот результат, который я получаю:

enter image description here

Это код:

func applyDesign() {

    let innerShadow = CALayer()
    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
    layer.addSublayer(innerShadow)
}

Как мне отредактировать код, чтобы текстовое поле снова корректно масштабировалось на экране?

1 Ответ

0 голосов
/ 26 февраля 2019

Главное, где вы вызываете 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 в какой-то одноразовый инициализатор (даже в этомленивое определение).

...