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
요청하신 대로 계층의 버튼에 특정되지는 않았지만 시각화하고 이해하기가 더 쉬웠습니다.
출처: 원본 출처
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)
}
하위 뷰의 프레임을 변환하기 위한 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
'source' 카테고리의 다른 글
SQL Server에서 음의 데이터를 양의 데이터로 변환 (0) | 2023.07.08 |
---|---|
strft time을 사용하여 기간(AM/PM)을 어떻게 계산할 수 있습니까? (0) | 2023.07.08 |
요청 범위 빈을 다른 빈에 주입합니다. (0) | 2023.07.08 |
SQL Server Management Studio를 사용하여 도커 컨테이너에 원격 연결 (0) | 2023.07.08 |
Vuex 대신 Apollo & GraphQL 캐싱을 사용하시겠습니까? (0) | 2023.07.08 |