首页 > 解决方案 > 约束布局更改后不触发 UIButton 操作

问题描述

我在故事板 ViewController 上有一个 UIButton。当我将数据加载到表单中并且布局发生显着变化时,按钮无法识别触摸动作。

我发现当按钮在滚动视图上可见时,如果填充了数据,则触摸操作有效。

如果数据太长,一开始按钮是不可见的,只是当它滚动到显示中时,触摸动作不起作用。

我正在检查按钮上方是否有东西,但什么也没有。我试图改变按钮的zPosition,没有解决问题。

可能是什么问题?

我从 UIScrollView 和 UIButton 制作了自定义类来检查触摸事件是如何触发的。它显示出相同的行为,这是显而易见的。如果按钮在开始时可见,则触发 UIButton 的 touchesBegan 事件。如果按钮向下移动并且在开始时不可见,则永远不会触发它,而是调用滚动视图的 touchesBegan。

根据我加载到页面中的数据大小,有时按钮在开始时是可见的,但表单仍然可以滚动一点。在这种情况下,按钮仍然可以工作,因此这种行为似乎不取决于滚动视图是否之前滚动,而仅取决于按钮的初始可见性。

是否应该调用任何布局或显示刷新函数来将行为设置回按钮?

我的故事板设置:

如果填充的数据需要更大的空间,则确保为滚动调整内容视图大小的代码部分。

func fillFormWithData() {
    dispDescription.text = jSonData[0]["advdescription"]
    dispLongDescription.text = jSonData[0]["advlongdesc"]
    priceandcurrency.text = jSonData[0]["advprice"]! + " " + jSonData[0]["advpricecur"]!
    validitydate.text = jSonData[0]["advdate"]!
    contentview.layoutIfNeeded()
    let contentRect = CGRect(x: 0, y: 0, width: scrollview.frame.width, height: uzenetbutton.frame.origin.y+uzenetbutton.frame.height+50)

    contentview.frame.size.height = contentRect.size.height
    scrollview.contentSize = contentview.bounds.size
}

数据加载后contentview+scrollview跳转到底部

滚动后,内容视图被剪切到原始屏幕尺寸

好的,所以另一个更新。我已将 contentview 背景着色为蓝色,并将滚动视图背景着色为白色。当我加载数据并调整布局约束的大小时,内容视图正在按预期调整大小,但是现在滚动视图正在底部。在我滚动视图后,它正在调整为适合屏幕的原始大小。现在,只有当我触摸后面的蓝色区域时,才能识别该按钮。在白色背景下,它不再被识别,所以滚动视图似乎隐藏了按钮。

标签: swiftuibuttontouchaction

解决方案


让我弄清楚故事板中添加的按钮,它是一个 spritekit 项目?如果您使用的是 zPosition?? 为什么不通过助手编辑器将 UIButton 连接为 IBAction,然后该操作始终与按钮相关联。

你也可以用不同的方式做

创建一个 SKLabelNode 并将其放在屏幕上您想要按钮的位置,然后将其命名为 myButton

override func touchesBegan(_ touches: Set<UITouch>, with event:
UIEvent?) {
 if let touch = touches.first {
    let location = touch.location(in: self)
    let tappedNodes = nodes(at: location)
      for node in tappedNodes {
        if node.name == "myButton" {
           // call your action here
        }
    }
  }
}

编辑 1:如果您通过应用程序或以编程方式添加任何视图,您也可以尝试自动调整 scrollView.content 的大小

    private func resizeScrollView(){
    print("RESIZING THE SCROLLVIEW from \(scrollView.contentSize)")
    for view in scrollView.subviews {
        contentRect = contentRect.union(view.frame)
    }
    scrollView.contentSize = CGSize(width: contentRect.size.width, height: contentRect.size.height + 150)
    print("THE CONTENT SIZE AFTER RESIZING IS: \(scrollView.contentSize)")
}

编辑2:我想我发现你的项目有问题。您需要将 MessageButton(UzenetButton) 移动到对象检查器中的 DispDescription 标签上方,这样它将始终位于您的消息 textView 上方。目前 UzeneButton 在您的视图层次结构中非常靠后,因此如果您的 textView 在编辑时调整大小,它会覆盖按钮,这就是您无法单击它的原因。


推荐阅读