iPhone - Get Position of UIView within entire UIWindow

后端 未结 6 1398
长发绾君心
长发绾君心 2020-11-27 09:14

The position of a UIView can obviously be determined by view.center or view.frame etc. but this only returns the position of the

相关标签:
6条回答
  • 2020-11-27 09:51

    In Swift:

    let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)
    
    0 讨论(0)
  • 2020-11-27 09:54

    That's an easy one:

    [aView convertPoint:localPosition toView:nil];
    

    ... converts a point in local coordinate space to window coordinates. You can use this method to calculate a view's origin in window space like this:

    [aView.superview convertPoint:aView.frame.origin toView:nil];
    

    2014 Edit: Looking at the popularity of Matt__C's comment it seems reasonable to point out that the coordinates...

    1. don't change when rotating the device.
    2. always have their origin in the top left corner of the unrotated screen.
    3. are window coordinates: The coordinate system ist defined by the bounds of the window. The screen's and device coordinate systems are different and should not be mixed up with window coordinates.
    0 讨论(0)
  • 2020-11-27 10:01

    For me this code worked best:

    private func getCoordinate(_ view: UIView) -> CGPoint {
        var x = view.frame.origin.x
        var y = view.frame.origin.y
        var oldView = view
    
        while let superView = oldView.superview {
            x += superView.frame.origin.x
            y += superView.frame.origin.y
            if superView.next is UIViewController {
                break //superView is the rootView of a UIViewController
            }
            oldView = superView
        }
    
        return CGPoint(x: x, y: y)
    }
    
    0 讨论(0)
  • 2020-11-27 10:05

    Here is a combination of the answer by @Mohsenasm and a comment from @Ghigo adopted to Swift

    extension UIView {
        var globalFrame: CGRect? {
            let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
            return self.superview?.convert(self.frame, to: rootView)
        }
    }
    
    0 讨论(0)
  • 2020-11-27 10:06

    Swift 3, with extension:

    extension UIView{
        var globalPoint :CGPoint? {
            return self.superview?.convert(self.frame.origin, to: nil)
        }
    
        var globalFrame :CGRect? {
            return self.superview?.convert(self.frame, to: nil)
        }
    }
    
    0 讨论(0)
  • 2020-11-27 10:09

    Swift 5+:

    let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)
    
    0 讨论(0)
提交回复
热议问题