ios 由于某种原因,滚动视图中的UI没有触发其目标函数

ff29svar  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(107)

我已经用Xcode编程两年了,我遇到了一个关于在我的自定义滚动视图中以编程方式初始化的一系列UI的问题。不管出于什么原因,当点击时,他们的目标函数@objc func buttonPressed(_ sender: UITapGestureRecognizer)没有打印语句“Button pressed!“.我以前从未遇到过这个问题,我希望有人能给我指出正确的方向。我已经包含了所有相关的代码,如果这还不够的话,我很乐意把整个类的代码贴出来。

{
    scrollView.frame = CGRect(x: -10, y: bottomView.layer.position.y - 340, width: view.frame.width + 20, height: 200)
    scrollView.backgroundColor = UIColor.black.withAlphaComponent(0.2)
    scrollView.layer.zPosition = 350
    scrollView.layer.borderColor =  UIColor.systemGreen.cgColor
    scrollView.layer.borderWidth = 0.3
    scrollView.isUserInteractionEnabled = true

    let scrollContent = UIView()
    scrollContent.isUserInteractionEnabled = true
    scrollView.isUserInteractionEnabled = true

    let buttonHeight: CGFloat = 70
    let buttonSpacing: CGFloat = 15
    let numberOfButtonsPerRow = 6
    let numberOfRows = 2
    let padding: CGFloat = 20

    for row in 0..<numberOfRows {
        for col in 0..<numberOfButtonsPerRow {
            let button = UIButton()
          
            button.frame = CGRect(x: padding + CGFloat(col) * (buttonHeight + buttonSpacing),
                                  y: padding + CGFloat(row) * (buttonHeight + buttonSpacing),
                                  width: buttonHeight,
                                  height: buttonHeight)
        
            button.setTitleColor(.white, for: .normal)
            button.backgroundColor = .black
            button.layer.zPosition = 500
            button.isUserInteractionEnabled = true
          
            button.layer.borderColor =  UIColor.systemGreen.cgColor
            button.layer.borderWidth = 0.75
            button.layer.cornerRadius = 10
          
            button.isUserInteractionEnabled = true

            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(buttonPressed(_:)))
                  button.addGestureRecognizer(tapGesture)
         
            let imageName = buttonImages[row * numberOfButtonsPerRow + col]
                  
            button.setImage(UIImage(named: imageName)?.withRenderingMode(.alwaysOriginal), for: .normal)
            scrollContent.addSubview(button)
            scrollContent.isUserInteractionEnabled = true
        }
    }

    let contentWidth = padding + CGFloat(numberOfButtonsPerRow) * (buttonHeight + buttonSpacing)
    let contentHeight = padding + CGFloat(numberOfRows) * (buttonHeight + buttonSpacing)
 
    scrollView.contentSize = CGSize(width: contentWidth, height: contentHeight)
 
    scrollView.addSubview(scrollContent)
     
    view.addSubview(scrollView)
}

@objc func buttonPressed(_ sender: UITapGestureRecognizer) {
    print("Button pressed!")
}

字符串

llew8vvj

llew8vvj1#

这些按钮并没有“触发它们的目标功能”,因为你没有点击这些按钮,尽管你可能认为你是。
你不能与UI元素进行交互,这些UI元素在它们的超视图(或该视图的超视图,以及链的上游)的边界之外。
将这一行添加到代码中:

scrollContent.clipsToBounds = true

字符串
然后运行应用程序。现在,你甚至不会看到任何按钮。
您必须给予scrollContent包含按钮的宽度和高度。
您可以使用这一行的按钮:

// give scrollContent a width and height that fits the buttons
scrollContent.frame.size = .init(width: contentWidth, height: contentHeight)


一个快速提示:在开发过程中,给予所有UI元素对比的背景色,这样您就可以很容易地看到框架。

scrollContent.backgroundColor = .yellow

相关问题