【问题标题】:How to bring a subview to front when selected in Swift?在 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)

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

【问题讨论】:

标签: swift xcode view


【解决方案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")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多