繁体   English   中英

获取UIStackView中的第一个UIButton

[英]Get the first UIButton in a 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. 在情节提要中添加阴影
  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)
}

如果您想获得有关其他方法的一些说明,只需评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM