iPhone-전체 UIWindow 내에서 UIView의 위치 가져 오기


206

a의 위치는 UIView분명히에 의해 결정될 수있다 view.center또는 view.frame등하지만 이것은 단지의 위치를 반환 UIView그것의 즉각적인 수퍼 관련.

UIView전체 320x480 좌표계에서 위치를 결정해야 합니다. (가) 예를 들어, UIViewA의 인 UITableViewCell윈도우 내에서 그것의 위치시킵니다 슈퍼 뷰의 극적 선명하게 촬상 변경 될 수 있습니다.

이것이 가능하다면 어떻게 생각합니까?

건배 :)

답변:


340

쉬운 일입니다.

[aView convertPoint:localPosition toView:nil];

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

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

2014 편집 : Matt__C의 의견이 인기를 보았을 때 좌표가 ...

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

굉장 :) 나는 그것이 간단해야한다고 생각했지만 애플이 그렇게 쉽게주지 않을 것이라는 느낌이 들었습니다. 감사합니다
Lior Frenkel

41
toView 매개 변수에 nil을 지정하면 장치 좌표가 제공되며, 세로 방향이 아닌 경우에는 원하는 좌표가 아닙니다. 참조 convertpointtoview -에 - 가로 모드를--잘못-값주고
Matt__C

2
이 방법은 계속 aView.frame.origin나에게 돌아 왔다. 내 견해의 감독이 그 자체로 견해를 가지고 있지 않다는 것을 깨닫는 데는 시간이 걸렸다.
Dan Abramov

3
superView에 superView가없는 경우보기가 전혀 표시되지 않아야합니다.
user4951

17
@Matt__C 연결 솔루션을 귀하의 사례에 적용하면 다음과 같이됩니다.[view.superview convertPoint:view.frame.origin toView:[UIApplication sharedApplication].keyWindow.rootViewController.view]
Ghigo

49

스위프트 5, 스위프트 4 :

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

33

스위프트 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)
    }
}


9

여기 @Mohsenasm의 답변과 Swift에 채택 된 @Chigo의 의견이 결합되어 있습니다.

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

간단하고 좋은!
nastassia
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.