什么时候UITableView被单击,我想显示ViewController它只支持景观,如果我使用当前方法显示BViewController从…AViewController当我回来的时候UITableView在……上面AViewController会因为旋转而重新加载数据,这不是我想要的。
如果我创建一个UIWindow它有一个rootViewController只支持landscapeRight...它工作得很好,但它有一个bug。
1.单击单元格并显示UIWindow带着UIViewController只支持景观 2.单击“主页”按钮退出应用程序。 3.回到应用程序 4.单击视图以关闭UIWindow 然后你会看到UITableView已经被放大了。
虫象
这是一个演示
如何解决这个问题UITableView被缩放
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在处理UITableView的显示和旋转问题时,确保界面的适应性和响应性是关键。根据您的描述,您希望在UITableView的单元格被点击后展示一个仅支持横屏(landscape)的ViewController,并且在返回时不希望UITableView重新加载数据或出现缩放问题。这里有几个建议来解决您的问题:
使用模态呈现(Modal Presentation): 而不是创建一个新的UIWindow,您可以考虑使用模态呈现的方式展示BViewController。这样可以避免UIWindow带来的副作用。在AViewController中,当单元格被点击时,使用present(_:animated:completion:)
方法以横屏模式呈现BViewController。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let bViewController = BViewController()
bViewController.modalPresentationStyle = .fullScreen // 或者其他适合的presentation style
present(bViewController, animated: true, completion: nil)
}
重写shouldAutorotate和supportedInterfaceOrientations: 在BViewController中,确保正确地重写了这些方法来限制其只支持横屏。
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
return .landscape
}
override var shouldAutorotate: Bool {
return true
}
override var prefersStatusBarHidden: Bool {
return true // 如果需要隐藏状态栏
}
管理UITableView的重新加载: 为了防止UITableView在返回到AViewController时重新加载数据,您可以在AViewController的viewWillAppear
或viewDidAppear
方法中控制数据的加载逻辑。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData() // 根据需要决定是否真的需要reloadData
}
处理视图层级和尺寸: 确保在显示和隐藏BViewController时,正确管理视图的层级和尺寸,避免UITableView因视图层次变化而发生意外的缩放。如果使用了Auto Layout,检查约束是否设置得当,特别是与父视图边缘相关的约束,确保它们能够适配不同情况下的界面布局。
利用UINavigationController进行导航: 如果可能,将AViewController和BViewController嵌入到UINavigationController中,这可以帮助管理视图控制器的生命周期和旋转行为,减少手动管理视图显示的问题。
通过上述方法,您可以更好地控制视图控制器的显示方式和屏幕方向,同时避免UITableView出现不期望的缩放行为。