在 Swift 中选择时如何将子视图置于前面?

Posted

技术标签:

【中文标题】在 Swift 中选择时如何将子视图置于前面?【英文标题】:How to bring a subview to front when selected in Swift? 【发布时间】:2018-05-28 12:31:03 【问题描述】:

所以我有两个视图,都以编程方式添加到超级视图中:

//First added view to my superView (baseView)
let imageViewOne = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
baseView.addSubview(imageViewOne)
//Second added view to my superView (baseView)
let imageViewTwo = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
baseView.addSubview(imageViewTwo)

我想在选中其中一个视图时将其置于最前面,因为当您添加新视图时,它会与前一个视图重叠。适用于“选择”或“触摸”的东西

【问题讨论】:

请参考此链接:***.com/questions/38780743/… 是的,我已经阅读了那篇文章,但它显然不是我需要的。我需要仅在选择或触摸视图后将其置于前面。 【参考方案1】:

使用这个:

baseView.bringSubview(toFront: imageViewOne)

【讨论】:

标识视图的部分在哪里被选中? 您可以将TapGestureeRecognizer附加到视图并从识别器的操作方法中调用上述命令。【参考方案2】:

您可以通过 UITapGestureRecognizer 通过从界面生成器设置恢复 ID 来完成此操作

func tapOneAct(sender: UITapGestureRecognizer) 
    if(sender.view!.restorationIdentifier == "view1") 
    // view1 is `Restoration ID` of imageViewOne
    
        view.bringSubview(toFront: imageViewOne)
    
    if(sender.view!.restorationIdentifier == "view2")
    // view2 is `Restoration ID` of 2nd view
    
        view.bringSubview(toFront: imageViewTwo)
    

【讨论】:

【参考方案3】:

如果我理解正确,那么您想检查所选视图的状态并将其置于视图层次结构的前面。 在这种情况下,您必须执行以下操作:

1) 曲目选择状态,在代码sn-p中设为var isSelected: Bool

2) 当视图被选中时,为一个动作保持回调(你可以使用例如UIButton 来观察点击事件)

在下面的代码 sn-p 中,您可以检查触摸视图时的选择状态。

BaseView 实现了检查SelectionView 状态的逻辑。

import UIKit

final class SelectionView<T: UIView>: UIView 

    var onTap: ((_ isSelected: Bool) -> ())?

    // MARK: - Private

    private let view: T
    private let button = UIButton(type: .custom)
    private var isSelected: Bool = false

    // MARK: - Init

    init(view: T) 
        self.view = view

        super.init(frame: .zero)

        setUp()
    

    // MARK: - Private

    private func setUp() 
        addSubview(view)
        addSubview(button)

        button.addTarget(self, action: #selector(onButtonTap), for: .touchUpInside)
    

    @objc private func onButtonTap() 
        isSelected = !isSelected

        onTap?(isSelected)
    

    // MARK: - Layout

    override func layoutSubviews() 
        super.layoutSubviews()

        view.frame = bounds
        button.frame = bounds
    

    override func sizeThatFits(_ size: CGSize) -> CGSize 
        return view.sizeThatFits(size)
    

    // MARK: - Unused

    override init(frame: CGRect) 
        fatalError("init(frame:) has not been implemented")
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


final class BaseView: UIView 

    init() 
        super.init(frame: .zero)

        let views = [SelectionView(view: UIView()), SelectionView(view: UIView())]
        for view in views 
            view.onTap =  [weak self, weak view] isSelected in
                guard let selectedView = view
                    else  return 

                if isSelected 
                    self?.bringSubview(toFront: selectedView)
                
            
        
    

    // MARK: - Unused

    override init(frame: CGRect) 
        fatalError("init(frame:) has not been implemented")
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

【讨论】:

以上是关于在 Swift 中选择时如何将子视图置于前面?的主要内容,如果未能解决你的问题,请参考以下文章

如何将子视图从其父视图的父视图置于顶部

如何在不改变其位置的情况下在界面生成器中将子视图置于前面

将子视图置于一切之上,但低于另一个 UIView

如何在 iOS 中将堆栈视图中的第一个视图置于最前面? [复制]

如何在linearLayout中将视图置于最前面

选择时将子视图添加到 UITableViewCell