Swift中在UITableView添加固定悬浮操作按钮(非菜单按钮)问题
解决UITableView悬浮按钮随滚动移动的问题
看起来你遇到的核心问题是按钮被“绑定”到了TableView的滚动层级里,导致跟着一起动。我来帮你梳理下问题根源和解决办法:
问题出在哪?
如果按钮会随TableView滚动,大概率是这两个原因之一:
- 按钮被错误地添加到了
UITableView的子视图层级中,而不是当前ViewController的根View上; - 你用固定
frame设置的位置是相对于TableView的坐标系,而非屏幕(根View)的坐标系。
另外,你的代码里还有个小坑:btn.addTarget(self,action: #selector(DestinationVC.buttonTapped), ...) 这里直接把目标方法指向未实例化的DestinationVC是不对的,应该在当前控制器里写跳转逻辑,再把target设为当前控制器的方法。
正确的实现方案(推荐用Auto Layout适配全机型)
我帮你修改了代码,改用Auto Layout把按钮固定在屏幕指定位置,同时修正了跳转逻辑的问题:
func setupFloatingButton() { let btn = UIButton(type: .custom) btn.setTitle("All Defects", for: .normal) btn.backgroundColor = #colorLiteral(red: 0.1764705926, green: 0.4980392158, blue: 0.7568627596, alpha: 1) btn.clipsToBounds = true btn.layer.cornerRadius = 50 btn.layer.borderColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1) btn.layer.borderWidth = 3.0 // 修正target:指向当前控制器的跳转方法 btn.addTarget(self, action: #selector(navigateToDestinationVC), for: .touchUpInside) // 关闭自动约束转换,开启手动Auto Layout btn.translatesAutoresizingMaskIntoConstraints = false // 关键:添加到ViewController的根View上,而非TableView view.addSubview(btn) // 设置约束:固定在屏幕右下角,距离底部、右侧各16pt,宽高100pt NSLayoutConstraint.activate([ btn.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16), btn.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -16), btn.widthAnchor.constraint(equalToConstant: 100), btn.heightAnchor.constraint(equalToConstant: 100) ]) } // 跳转逻辑写在当前控制器的方法里 @objc func navigateToDestinationVC() { let destinationVC = DestinationVC() // 根据你的导航方式选择push或present navigationController?.pushViewController(destinationVC, animated: true) // 如果是模态跳转用下面这句: // present(destinationVC, animated: true) }
关键注意点
- 确保在
viewDidLoad()或viewWillAppear()里调用setupFloatingButton(),不要在TableView的数据源方法(比如cellForRowAt)里调用,否则会重复添加按钮; - 确认
view.addSubview(btn)中的view是当前ViewController的根View,不是TableView的实例; - Auto Layout的约束是绑定到根View的边缘,所以不管TableView怎么滚动,按钮位置都不会变。
内容的提问来源于stack exchange,提问作者Saurabh
相关产品推荐
相关产品推荐

