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

标签 ios swift xcode uiscrollview

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

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

最佳答案

对于任何可能有同样问题的人。问题出在手势上下文“self”上,详细解释如下https://stackoverflow.com/a/53717065/2448688 通过初始化Gesture解决了这个问题,如下

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

关于ios - 如何在 Swift 5 中的 UIScrollView 内以编程方式生成的 UIView 上实现点击手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116584/

相关文章:

iphone - 如何在 UIToolBar 中添加条形按钮

swift - 嵌套类型别名隐藏外部类型声明

swift - 我如何使用协议(protocol)将数据从我的 View Controller 传递到其中的容器?

ios - UITableView 中来自 NSData 的 UIImage - 性能问题

objective-c - 可拉 View Objective c

ios - 如何使用 Swift 泛型传递类型并返回该类型的对象?

ios - 日志未出现在 Web Inspector 中

ios - 方向更改时 UINavigationController 工具栏高度

xcode - Swift Spritekit 图像在呈现新场景后自行调整大小

objective-c - 未获得 Tan (90) 值,因为 Objective-c 中未定义