在UIStackView中获取第一个UIButton

时间:2017-01-31 02:22:59

标签: ios swift uiview 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中的递归来做到这一点,但我想要更精确地优化性能,并且更愿意一次性添加阴影。

1 个答案:

答案 0 :(得分:0)

您有几个选择:

  1. 在故事板中添加阴影
  2. 在按钮上添加插座,然后在代码中添加阴影
  3. 将按钮添加到集合中,然后枚举添加阴影的集合
  4. 以递归的方式添加阴影(这不会像你想象的那样达到性能,添加阴影会比递归这样做更伤害性能)
  5. 你是正确的,因为按钮是堆栈视图上的一个视图,因此你的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)
    }
    

    如果您想要了解如何执行其他任何方式的说明,请发表评论。