在 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 中选择时如何将子视图置于前面?的主要内容,如果未能解决你的问题,请参考以下文章