OGeek|极客世界-中国程序员成长平台

标题: ios - 获取 UIStackView 中的第一个 UIButton [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-11 18:46
标题: ios - 获取 UIStackView 中的第一个 UIButton

我正在处理我的 View ,但在堆栈 View 中的按钮周围出现阴影时遇到了问题。我所做的大部分工作都直接在 Storyboard中。

Storyboard render showing background

Simulator render missing background

这是我用来将阴影应用到 View 的方法

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

的 View 中找到按钮的方式
for subview in self.view.subviews {
    if subview.isKind(of: UIButton.self) && subview.tag == 1 {
        addShadow(to: subview)
    }
}

我知道问题出在堆栈 View 和堆栈 View 内的 UIView 中,其中包含按钮。 (self.view > UIStackView > UIView > [UIButton, UILabel])

我知道我可以通过 for-loop 中的递归来做到这一点,但我试图更精确一点以优化性能,并且更愿意一次性添加阴影。



Best Answer-推荐答案


你有几个选择:

  1. 在 Storyboard 本身中添加阴影
  2. 为按钮添加一个 socket ,然后在代码中添加阴影
  3. 将按钮添加到集合中,然后枚举集合添加阴影
  4. 递归添加阴影(这不会像您想象的那样严重影响性能,添加阴影比递归执行此操作更会损害性能)

你是正确的,因为按钮是堆栈 View 上的一个 View ,所以你的 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)
}

如果您需要有关如何执行任何其他方式的说明,请发表评论。

关于ios - 获取 UIStackView 中的第一个 UIButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41948710/






欢迎光临 OGeek|极客世界-中国程序员成长平台 (https://ogeek.cn/) Powered by Discuz! X3.4