source

UIView의 Superview에 대한 UIView의 위치를 확인합니다.

factcode 2023. 7. 8. 11:14
반응형

UIView의 Superview에 대한 UIView의 위치를 확인합니다.

UI 버튼을 정렬한 UI 보기가 있습니다.저는 그 UI 버튼들의 위치를 찾고 싶습니다.

알고 있습니다buttons.frame제게 자리를 줄 것이지만, 그것은 제게 직접적인 감독과 관련된 자리만 줄 것입니다.

UIButtons superview와 관련하여 해당 버튼의 위치를 찾을 수 있는 방법이 있습니까?

예를 들어 "firstView"라는 이름의 UIView가 있다고 가정합니다.

그리고 또 다른 UIView인 "secondView"가 있습니다.이 "두 번째 보기"는 "첫 번째 보기"의 하위 보기입니다.

그러면 UIButton을 "두 번째 보기"의 하위 보기로 설정합니다.

->UIViewController.view
--->FirstView A
------->SecondView B
------------>Button

자, 이제 "first View"와 관련하여 UI 버튼의 위치를 찾을 수 있는 방법이 있습니까?

다음을 사용할 수 있습니다.

목표-C

CGRect frame = [firstView convertRect:buttons.frame fromView:secondView];

스위프트

let frame = firstView.convert(buttons.frame, from:secondView)

설명서 참조:

https://developer.apple.com/documentation/uikit/uiview/1622498-convert

요청하신 대로 계층의 버튼에 특정되지는 않았지만 시각화하고 이해하기가 더 쉬웠습니다.

출처: 원본 출처

enter image description here

ObjC:

CGPoint point = [subview1 convertPoint:subview2.frame.origin toView:viewController.view];

스위프트:

let point = subview1.convert(subview2.frame.origin, to: viewControll.view)

Swift 3용으로 업데이트됨

    if let frame = yourViewName.superview?.convert(yourViewName.frame, to: nil) {

        print(frame)
    }

enter image description here

하위 뷰의 프레임을 변환하기 위한 UIView 확장(@Rexb 응답에서 영감을 받음).

extension UIView {

    // there can be other views between `subview` and `self`
    func getConvertedFrame(fromSubview subview: UIView) -> CGRect? {
        // check if `subview` is a subview of self
        guard subview.isDescendant(of: self) else {
            return nil
        }
        
        var frame = subview.frame
        if subview.superview == nil {
            return frame
        }
        
        var superview = subview.superview
        while superview != self {
            frame = superview!.convert(frame, to: superview!.superview)
            if superview!.superview == nil {
                break
            } else {
                superview = superview!.superview
            }
        }
        
        return superview!.convert(frame, to: self)
    }

}

// usage:
let frame = firstView.getConvertedFrame(fromSubview: buttonView)

프레임: (X,Y,폭,높이)

따라서 너비와 높이는 슈퍼 슈퍼 뷰에도 변화가 없습니다.X, Y는 다음과 같이 쉽게 구할 수 있습니다.

X = button.frame.origin.x + [button superview].frame.origin.x;
Y = button.frame.origin.y + [button superview].frame.origin.y;

여러 개의 보기가 쌓여 있고 관심 있는 보기 간에 가능한 보기를 알 필요가 없거나 알고 싶은 경우 다음 작업을 수행할 수 있습니다.

static func getConvertedPoint(_ targetView: UIView, baseView: UIView)->CGPoint{
    var pnt = targetView.frame.origin
    if nil == targetView.superview{
        return pnt
    }
    var superView = targetView.superview
    while superView != baseView{
        pnt = superView!.convert(pnt, to: superView!.superview)
        if nil == superView!.superview{
            break
        }else{
            superView = superView!.superview
        }
    }
    return superView!.convert(pnt, to: baseView)
}

어디에targetView'버튼'이 될 겁니다baseView가 될 것입니다.ViewController.view.
이 기능이 수행하려는 작업은 다음과 같습니다.
한다면targetView수퍼 뷰가 없습니다. 현재 좌표가 반환됩니다.
한다면targetView's수퍼 뷰는 기본 뷰가 아닙니다(즉, 버튼과 버튼 사이에 다른 뷰가 있습니다).viewcontroller.view), 변환된 좌표가 검색되어 다음으로 전달됩니다.superview.
기본 뷰로 이동하는 뷰 스택을 통해 동일한 작업을 계속 수행합니다.
일단 그것이 도착하면,baseView마지막 변환을 수행하고 반환합니다.
참고: 다음과 같은 상황은 처리하지 않습니다.targetView아래에 위치합니다.baseView.

당신은 다음과 같은 슈퍼 슈퍼 뷰를 쉽게 얻을 수 있습니다.

두 번째 보기 -> [버튼 수퍼뷰]
첫 번째 보기 -> [버튼 수퍼뷰]

그러면 버튼의 위치를 알 수 있습니다.

다음을 사용할 수 있습니다.

xPosition = [[button superview] superview].frame.origin.x;
yPosition = [[button superview] superview].frame.origin.y;

다음 코드는 보기 계층에서 위치가 필요한 보기의 깊이(내포)에 관계없이 작동합니다.

위가필요가보겠다니습정해고다하의 가 필요하다고 .myView은 있는에안 안에 .myViewsContainer그리고 보기 계층 구조에서 매우 깊은 곳에 있는 다음 순서는 다음과 같습니다.

let myViewLocation = myViewsContainer.convert(myView.center, to: self.view)
  • myViewsContainer: 위치가 필요한 보기가 있는 보기 컨테이너입니다.

  • 보기: 위치가 필요한 보기입니다.

  • self.view : 기본 보기

언급URL : https://stackoverflow.com/questions/17572304/get-position-of-uiview-in-respect-to-its-superviews-superview

반응형