【问题标题】:Get the first UIButton in a UIStackView获取 UIStackView 中的第一个 UIButton
【发布时间】:2017-06-16 08:47:09
【问题描述】:

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

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

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 中的递归来做到这一点,但我试图更加精确一点以优化性能,并且更愿意一次性添加阴影。

【问题讨论】:

    标签: ios swift uiview uibutton uistackview


    【解决方案1】:

    你有几个选择:

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

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

    【讨论】:

    • 我知道阴影会影响性能,但它们很好地暗示了按钮是什么,因为我早期的 UI Alpha 测试人员没有意识到某些图标是按钮。在这种情况下,这是一个必要的邪恶,我只是不想复合它。谢谢你的回复,我试试看。
    • 即使在递归之后它仍然无法工作,因为按钮所在的 UIView 不会转换为堆栈视图。相反,我确实喜欢将循环分解为一个单独的方法,并采纳您的其他建议,然后为按钮创建一个出口。
    • 哦,您的按钮位于堆栈视图内的视图中吗?是的,上面的代码对此不起作用。
    • 可以将 stackView 检查更改为 let subviewsSubviews = subview.subviews; if subviewsSubviews.count > 0 {
    猜你喜欢
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 2016-02-29
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    相关资源
    最近更新 更多