Ios 获取UIStack视图中的第一个UIButton

Ios 获取UIStack视图中的第一个UIButton,ios,swift,uiview,uibutton,uistackview,Ios,Swift,Uiview,Uibutton,Uistackview,我正在处理我的视图,在堆栈视图中的按钮周围有阴影,这是一个问题。我所做的大部分工作都是直接在故事板中完成的 下面是我用于将阴影应用于视图的方法 func addShadow(to view: UIView) { view.layer.shadowColor = shadowColor view.layer.shadowOpacity = shadowOpacity view.layer.shadowOffset = shadowOffset if let bo

我正在处理我的视图,在堆栈视图中的按钮周围有阴影,这是一个问题。我所做的大部分工作都是直接在故事板中完成的

下面是我用于将阴影应用于视图的方法

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)
    }
}
我知道问题源于stack视图和保存按钮的stack视图内部的UIView。(self.view>UIStackView>UIView>[UIButton,UILabel])


我知道我可以通过循环中的递归来实现这一点,但我正在尝试更精确地优化性能,并且更愿意一次添加阴影。

您有几个选项:

  • 在情节提要本身中添加阴影
  • 将插座添加到按钮,然后在代码中添加阴影
  • 将按钮添加到集合,然后枚举集合并添加阴影
  • 递归地添加阴影(这不会像您想象的那样严重地影响性能,添加阴影比递归地添加阴影对性能的影响更大)
  • 您是正确的,因为按钮是堆栈视图上的视图,所以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)
    }
    

    如果您想了解如何使用其他方法,只需发表评论。

    我知道阴影是一种性能影响,但它们很好地暗示了按钮是什么,因为我早期的UI Alpha测试人员没有意识到一些图标是按钮。在这种情况下,这是一种必然的罪恶,我只是不想让它复杂化。谢谢你的回复,我会试一试。即使在递归之后,按钮所在的UIView仍无法转换为stackview。相反,我喜欢将循环分解成一个单独的方法,并采纳了您的其他建议,为按钮创建了一个出口。哦,您的按钮位于堆栈视图中的视图中?是的,上面的代码对此不起作用。可以将stackView检查更改为类似于
    let subviewsubviews=subview.subviews;如果subviewsubviews.count>0{