programing

iPhone - 전체 UI에서 UIView 위치 가져오기

bestprogram 2023. 4. 17. 22:32

iPhone - 전체 UI에서 UIView 위치 가져오기

의 위치UIView분명히 결정될 수 있다view.center또는view.frame등입니다만, 이것은, 의 위치만을 되돌립니다.UIView그 직속적인 감시와 관련해서요.

그 위치를 결정할 필요가 있습니다.UIView320x420 좌표계 전체로 볼 수 있습니다.예를 들어,UIView에 있다UITableViewCell슈퍼뷰에 관계없이 윈도우 내의 위치가 극적으로 변경될 수 있습니다.

이것이 가능한지, 어떻게 가능한지에 대한 의견이 있습니까?

그건 쉬운 일이야.

[aView convertPoint:localPosition toView:nil];

... 로컬 좌표 공간의 점을 창 좌표로 변환합니다.이 방법을 사용하여 창 공간에서 다음과 같이 뷰의 원점을 계산할 수 있습니다.

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

2014년 편집:Matt__C의 코멘트의 인기를 보면 좌표가...

  1. 장치를 회전할 때 변경하지 마십시오.
  2. 항상 회전하지 않은 화면의 왼쪽 상단 모서리에 원점이 있습니다.
  3. 창 좌표:좌표계는 윈도우의 경계에 의해 정의됩니다.화면 및 장치 좌표계는 서로 다르므로 윈도우 좌표와 혼동해서는 안 됩니다.

Swift 5 이상:

let globalPoint = aView.superview?.convert(aView.frame.origin, to: nil)

Swift 3(확장 기능 포함):

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)
    }
}

Swift의 경우:

let globalPoint = aView.superview?.convertPoint(aView.frame.origin, toView: nil)

다음은 @Mohsenasm의 답변과 Swift에 채택된 @Ghigo의 코멘트를 조합한 것입니다.

extension UIView {
    var globalFrame: CGRect? {
        let rootView = UIApplication.shared.keyWindow?.rootViewController?.view
        return self.superview?.convert(self.frame, to: rootView)
    }
}

이 코드가 가장 효과적이었습니다.

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)
}

나에게는 잘 통한다:)

extension UIView {
    var globalFrame: CGRect {
        return convert(bounds, to: window)
    }
}

이것은 나에게 효과가 있었다.

view.layoutIfNeeded() // this might be necessary depending on when you need to get the frame

guard let keyWindow = UIApplication.shared.windows.first(where: { $0.isKeyWindow }) else { return }

let frame = yourView.convert(yourView.bounds, to: keyWindow)

print("frame: ", frame)

언급URL : https://stackoverflow.com/questions/1465394/iphone-get-position-of-uiview-within-entire-uiwindow