Получить первую UIButton в UIStackView

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

Раскадровка визуализации показывает фон

Симулятор рендеринга отсутствующего фона

Вот метод, который я использую, чтобы применить тень к представлению

func addShadow(to view: UIView) {
    view.layer.shadowColor = shadowColor
    view.layer.shadowOpacity = shadowOpacity
    view.layer.shadowOffset = shadowOffset
    if let bounds = view.subviews.first?.bounds {
        view.layer.shadowPath = UIBezierPath(rect: bounds).cgPath
    }

    view.layer.shouldRasterize = true
}

и вот как я нахожу кнопку в представлении от ViewController.swift

for subview in self.view.subviews {
    if subview.isKind(of: UIButton.self) && subview.tag == 1 {
        addShadow(to: subview)
    }
}

Я знаю, что проблема связана с представлением стека и UIView внутри представления стека, которое содержит кнопку. (self.view > UIStackView > UIView > [UIButton, UILabel])

Я знаю, что могу сделать это с помощью рекурсии в for-loop но я пытаюсь быть немного более точным, чтобы оптимизировать производительность и предпочел бы добавить тени в один кадр.

1 ответ

У вас есть несколько вариантов:

  1. добавить тень в самой раскадровке
  2. добавить розетку к кнопке, затем добавить тень в коде
  3. добавить кнопку в коллекцию, затем перечислить коллекцию, добавив тени
  4. рекурсивно добавлять тени (это не повлияет на производительность почти так же сильно, как вы думаете, добавление теней вредит производительности больше, чем делать это рекурсивно)

Вы правы в том, что кнопка является представлением стека, поэтому цикл for не нажимает кнопку непосредственно, чтобы добавить к ней тень.

Самый простой способ решить эту проблему - рекурсивный способ или что-то вроде этого:

func addShadowsTo(subviews: [UIView]) {
    for subview in subviews {
        if subview.isKind(of: UIButton.self) && subview.tag == 1 {
            addShadow(to: subview)
        }

        if let stackView = subview as? UIStackView {
            addShadowToSubviews(subviews: stackView.subviews)
        }
    }
}

func viewDidload() {
    super.viewDidLoad()

    addShadowsTo(subviews: view.subviews)
}

Если вы хотите получить некоторые инструкции о том, как это сделать, просто прокомментируйте.

Другие вопросы по тегам