Ios UIView.convert在UIWindow中计算UITableViewCell子视图时给出错误的结果
当我尝试在UIWindow内的UITableViewCell中转换子视图的坐标时,它给出的结果没有添加UINavigationBar的高度,就像它位于屏幕顶部,但位于UINavigationController内部一样。也许我做错了什么Ios UIView.convert在UIWindow中计算UITableViewCell子视图时给出错误的结果,ios,iphone,swift,uitableview,uiview,Ios,Iphone,Swift,Uitableview,Uiview,当我尝试在UIWindow内的UITableViewCell中转换子视图的坐标时,它给出的结果没有添加UINavigationBar的高度,就像它位于屏幕顶部,但位于UINavigationController内部一样。也许我做错了什么 open var targetView: UIView? { didSet { if let tView = targetView { targetFrame = self.convert(self.frame,
open var targetView: UIView? {
didSet {
if let tView = targetView {
targetFrame = self.convert(self.frame, to: tView)
}
}
}
self是UITableViewCell中的一个子视图,targetView是UIApplication.shared.keyWindow我创建了一个最简单的应用程序来测试它,它工作得非常好。您可能错过了对
superview
的调用,尽管导航栏的高度会有精确的差异,这似乎很奇怪。无论如何,请尝试:
targetFrame = self.superView!.convert(self.frame, to: tView) // TODO: remove the force-unwrap
我使用的是导航栏中带有委托方法的表视图:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let view = tableView.cellForRow(at: indexPath)
// let view = tableView.cellForRow(at: indexPath)?.textLabel // Also works
let parent = UIApplication.shared.keyWindow
let converted = view?.superview?.convert(view!.frame, to: parent)
print("\(converted)")
}
打印的值确实包括导航栏。我创建了一个最简单的应用程序来测试它,它工作得非常好。您可能错过了对
superview
的调用,尽管导航栏的高度会有精确的差异,这似乎很奇怪。无论如何,请尝试:
targetFrame = self.superView!.convert(self.frame, to: tView) // TODO: remove the force-unwrap
我使用的是导航栏中带有委托方法的表视图:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let view = tableView.cellForRow(at: indexPath)
// let view = tableView.cellForRow(at: indexPath)?.textLabel // Also works
let parent = UIApplication.shared.keyWindow
let converted = view?.superview?.convert(view!.frame, to: parent)
print("\(converted)")
}
打印的值确实包括导航栏。对superView的调用是“一个主键”:@dev View的框架是从其superView的角度定义的。视图的边界是从其内部开始的。因此,转换边界而不是框架也可以做到这一点。对superView的调用是“一个关键”:@dev View的框架是从其superView的角度定义的。视图的边界是从其内部开始的。因此,转换边界而不是帧也可以做到这一点。