如何在 Swift 5 的 UIScrollView 中以编程方式生成的 UIView 上实现点击手势



我正在尝试在UIScrollView中创建一个UIView位置,两者都是在Swift中以编程方式生成的。在编译时,我能够按预期看到它们,但我无法在 UIView 上调用点击手势。我经历了各种相同的例子,它们都有与我相似的东西。我的代码如下。注意:我有一个从自动布局添加的包装器视图作为超级视图

override func viewDidLoad() {
super.viewDidLoad()
let mediaTapRecognizer = UITapGestureRecognizer(target: self, action: #selector( self.openMedia ) )
let slideShowWidth = self.wrapperView.bounds.width
let slideShowHeight = 225
let slideShowScrollView: UIScrollView = {
let scroll = UIScrollView()
scroll.isPagingEnabled = false
scroll.showsHorizontalScrollIndicator = false
scroll.showsVerticalScrollIndicator = false
scroll.backgroundColor = .white
scroll.frame = CGRect (x: 0,  y: 0, width: self.wrapperView.bounds.width , height: CGFloat(slideShowHeight) )
scroll.contentSize = CGSize(width:  slideShowWidth , height: CGFloat(slideShowHeight) )
return scroll
}()
self.wrapperView.addSubview(slideShowScrollView)
slideShowScrollView.widthAnchor.constraint(equalToConstant: self.wrapperView.bounds.width ).isActive = true
slideShowScrollView.heightAnchor.constraint(equalToConstant: CGFloat(slideShowHeight) ).isActive = true
slideShowScrollView.leadingAnchor.constraint(equalTo: self.wrapperView.leadingAnchor).isActive = true
slideShowScrollView.topAnchor.constraint(equalTo: self.wrapperView.topAnchor).isActive = true
slideShowScrollView.trailingAnchor.constraint(equalTo: self.wrapperView.trailingAnchor).isActive = true
//slideShowScrollView.bottomAnchor.constraint(equalTo: self.wrapperView.bottomAnchor).isActive = true
let placeholder:UIView = {
let view = UIView()
view.frame = CGRect (x: 0,  y: 0, width: self.view.bounds.width , height: CGFloat(slideShowHeight) )
view.backgroundColor = .brown
return view
}()
//slideShowScrollView.clipsToBounds = true
slideShowScrollView.addSubview(placeholder)
placeholder.isUserInteractionEnabled = true
placeholder.addGestureRecognizer(mediaTapRecognizer)
placeholder.translatesAutoresizingMaskIntoConstraints = false
placeholder.widthAnchor.constraint(equalToConstant: self.wrapperView.bounds.width ).isActive = true
placeholder.heightAnchor.constraint(equalToConstant: CGFloat(slideShowHeight) ).isActive = true
placeholder.leadingAnchor.constraint(equalTo: slideShowScrollView.leadingAnchor).isActive = true
placeholder.topAnchor.constraint(equalTo: slideShowScrollView.topAnchor).isActive = true
placeholder.trailingAnchor.constraint(equalTo: slideShowScrollView.trailingAnchor).isActive = true
placeholder.bottomAnchor.constraint(equalTo: slideShowScrollView.bottomAnchor).isActive = true
}
@objc func openMedia(){
//print("The clicked media is (sender)")
print("The clicked media is me")
}

对于可能遇到相同问题的任何人。问题出在手势上下文"自我"上,在这里详细解释了 https://stackoverflow.com/a/53717065/2448688 通过初始化手势解决了它,如下所示

var mediaTapRecognizer : UITapGestureRecognizer {
let t = UITapGestureRecognizer(target: self, action: #selector(openMedia))
return t
}

最新更新