Получить первую 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 ответ
У вас есть несколько вариантов:
- добавить тень в самой раскадровке
- добавить розетку к кнопке, затем добавить тень в коде
- добавить кнопку в коллекцию, затем перечислить коллекцию, добавив тени
- рекурсивно добавлять тени (это не повлияет на производительность почти так же сильно, как вы думаете, добавление теней вредит производительности больше, чем делать это рекурсивно)
Вы правы в том, что кнопка является представлением стека, поэтому цикл 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)
}
Если вы хотите получить некоторые инструкции о том, как это сделать, просто прокомментируйте.