Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIView.convert在UIWindow中计算UITableViewCell子视图时给出错误的结果_Ios_Iphone_Swift_Uitableview_Uiview - Fatal编程技术网

Ios UIView.convert在UIWindow中计算UITableViewCell子视图时给出错误的结果

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,

当我尝试在UIWindow内的UITableViewCell中转换子视图的坐标时,它给出的结果没有添加UINavigationBar的高度,就像它位于屏幕顶部,但位于UINavigationController内部一样。也许我做错了什么

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的角度定义的。视图的边界是从其内部开始的。因此,转换边界而不是帧也可以做到这一点。