swift - 约束布局更改后不触发 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 背景着色为蓝色,并将滚动视图背景着色为白色。当我加载数据并调整布局约束的大小时,内容视图正在按预期调整大小,但是现在滚动视图正在底部。在我滚动视图后,它正在调整为适合屏幕的原始大小。现在,只有当我触摸后面的蓝色区域时,才能识别该按钮。在白色背景下,它不再被识别,所以滚动视图似乎隐藏了按钮。
解决方案
让我弄清楚故事板中添加的按钮,它是一个 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 在编辑时调整大小,它会覆盖按钮,这就是您无法单击它的原因。
推荐阅读
- qt - 获取 QImage 源文件路径
- vue.js - 如何访问 v-for 中的元素
- machine-learning - 为什么我们需要机器学习的标准化和规范化?
- r - 聚类 x 轴条形图
- javascript - 使用 Jquery 调用下一个 td
- java - 在 PathVariable 中获取空值
- javascript - 如何使 emscripten 生成更好的代码
- elasticsearch - 将多个 Elastic Beats 扩展到集中式 Logstash 的最佳实践是什么
- javascript - Javascript解构:通过引用复制类变量以允许分配和修改值
- javascript - Nest 无法解析 USERRepository 的依赖项