2017-01-31 2 views
2

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

Storyboard render showing background

Simulator render missing background

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

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, но я стараюсь быть более точным, чтобы оптимизировать производительность и предпочел бы добавить тени одним выстрелом.

ответ

0

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

  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) 
} 

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

+0

Я понимаю, что тени - это удар по производительности, но они прекрасно подходят, чтобы намекнуть на то, что кнопка с тех пор, как мои ранние альфа-тестеры интерфейса не понимали, что некоторые из значков были кнопками. В этом случае это необходимое зло, я просто не пытаюсь его усугубить. Спасибо за ваш ответ, я дам этот снимок. –

+0

Даже после рекурсии он все еще не работал как UIView, в котором находится кнопка, не конвертируется в стек. Вместо этого мне захотелось вырвать петлю в отдельный метод, и я взял ваш другой совет и просто сделал выход для кнопки. –

+0

О, у вас есть кнопка в представлении внутри стека? Да, приведенный выше код не сработает для этого. – ColdLogic