UIView 프레임, 경계 및 중심
저는 이 속성들을 올바른 방법으로 사용하는 방법을 알고 싶습니다.
제가 알기로는frame
작성 중인 보기의 컨테이너에서 사용할 수 있습니다.컨테이너 뷰를 기준으로 뷰 위치를 설정합니다.또한 해당 보기의 크기를 설정합니다.
도.center
작성 중인 보기의 컨테이너에서 사용할 수 있습니다.이 속성은 컨테이너를 기준으로 뷰의 위치를 변경합니다.
마내침.bounds
뷰 자체에 상대적입니다.뷰의 그리기 가능 영역을 변경합니다.
사이의 관계에 대해 더 많은 정보를 줄 수 있습니까?frame
그리고.bounds
그럼 어떻게 해요?clipsToBounds
그리고.masksToBounds
부동산?
제가 한 질문은 여러 번 보였기 때문에 자세한 답변을 드리겠습니다.더 정확한 내용을 추가하고 싶다면 자유롭게 수정하세요.
먼저 질문을 요약합니다. 프레임, 경계, 중심 그리고 그들의 관계입니다.
프레임 A 뷰의frame
(CGRect
은 ( ) ▁the에서 입니다.superview
. 합니다.기본적으로 왼쪽 상단에서 시작합니다.
경계 A 뷰의bounds
(CGRect
)는 뷰 직사각형을 자체 좌표계로 나타냅니다.
센터 Acenter
입니다.CGPoint
의관에 됩니다.superview
의 좌표계는 뷰의 정확한 중심점 위치를 결정합니다.
UIView + 위치에서 가져온 다음과 같은 관계입니다(비공식 방정식이므로 코드에서는 작동하지 않습니다).
frame.origin = center - (bounds.size / 2.0)
center = frame.origin + (bounds.size / 2.0)
frame.size = bounds.size
참고: 이러한 관계는 뷰가 회전하는 경우에는 적용되지 않습니다.자세한 내용은 Stanford CS193p 코스를 기준으로 The Kitchen Drawer에서 촬영한 다음 이미지를 참고하시기 바랍니다.크레딧은 @Rhubarb에게 주어집니다.
frame
뷰 내에서 뷰의 위치를 변경하거나 크기를 조정할 수 있습니다.superview
일반적으로 다음에서 사용할 수 있습니다.superview
예를 들어 특정 하위 보기를 생성할 때.예:
// view1 will be positioned at x = 30, y = 20 starting the top left corner of [self view]
// [self view] could be the view managed by a UIViewController
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
▁a필▁inside때inates▁to▁when요할▁you▁the▁coord.view
당이보언것은는급하통을 가리킵니다.bounds
일반적인 예는 다음과 같은 범위 내에서 그릴 수 있습니다.view
제1부의 부속서로서의 부관서브뷰를 그리는 것은 다음을 알기 위해 필요합니다.bounds
들어 다음과 같습니다.예:
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(50.0f, 50.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
view2.backgroundColor = [UIColor yellowColor];
[view1 addSubview:view2];
변경 시 다양한 동작이 발생합니다.bounds
의 관점에서예를 들어, 다음을 변경하는 경우bounds
size
,frame
변경(및 그 반대).변화는 다음과 같은 주변에서 발생합니다.center
하여 어떻게하십시오.아래 코드를 사용하여 어떻게 되는지 확인합니다.
NSLog(@"Old Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"Old Center %@", NSStringFromCGPoint(view2.center));
CGRect frame = view2.bounds;
frame.size.height += 20.0f;
frame.size.width += 20.0f;
view2.bounds = frame;
NSLog(@"New Frame %@", NSStringFromCGRect(view2.frame));
NSLog(@"New Center %@", NSStringFromCGPoint(view2.center));
게다가, 만약 당신이 변한다면,bounds
origin
당신은 그것을 바꿉니다.origin
내부 좌표계의.으로 적으로origin
에 있음(0.0, 0.0)
(왼쪽 위 모서리).예를 들어, 다음을 변경하는 경우origin
위해서view1
이제 왼쪽 상단 모서리에서 (원하는 경우 이전 코드를 삭제) 볼 수 있습니다.view2
동적인에 view1
하나. 동기부여는 아주 간단합니다.당신이 말하는 것은view1
왼쪽 상단 모서리가 현재 위치에 있는지 여부(20.0, 20.0)
그러나 그 이후로view2
의frame
origin
에서 시작합니다.(20.0, 20.0)
그들은 일치할 것입니다.
CGRect frame = view1.bounds;
frame.origin.x += 20.0f;
frame.origin.y += 20.0f;
view1.bounds = frame;
그origin
는 를나니다냅타▁the를 나타냅니다.view
의 의내에위 superview
하만위설다니명의 를 설명합니다.bounds
중심.
마내침.bounds
그리고.origin
관련 개념이 아닙니다.둘 다 다음을 도출할 수 있습니다.frame
(이전 방정식 참조).
View1의 사례 연구
다음은 다음 스니펫을 사용할 때 발생하는 작업입니다.
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(30.0f, 20.0f, 400.0f, 400.0f)];
view1.backgroundColor = [UIColor redColor];
[[self view] addSubview:view1];
NSLog(@"view1's frame is: %@", NSStringFromCGRect([view1 frame]));
NSLog(@"view1's bounds is: %@", NSStringFromCGRect([view1 bounds]));
NSLog(@"view1's center is: %@", NSStringFromCGPoint([view1 center]));
상대 이미지.
대신 내가 바뀌면 어떻게 되는 거지?[self view]
다음과 같은 경계
// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];
상대 이미지.
당신이 말하는 것은[self view]
왼쪽 상단 모서리가 현재 위치(30.0, 20.0)에 있지만 이후view1
의 프레임 원점은 (30.0, 20.0)에서 시작하며 일치합니다.
추가 참조(원하는 경우 다른 참조로 업데이트)
에 대하여clipsToBounds
문서Apple 문서출처)
이 값을 YES로 설정하면 하위 보기가 수신기의 경계로 클리핑됩니다.NO로 설정하면 프레임이 수신기의 가시 범위를 벗어나는 하위 보기가 잘리지 않습니다.기본값은 NO입니다.
뷰가만.frame
이라(0, 0, 100, 100)
는 그고그것개요는의리는.(90, 90, 30, 30)
해당 하위 보기의 일부만 볼 수 있습니다.후자는 상위 보기의 범위를 초과하지 않습니다.
masksToBounds
는 와동합다니등다에 합니다.clipsToBounds
에 신로대로▁a.UIView
은 이속에적니다됩에 됩니다.CALayer
드후아에래,에▁the▁under후,래.clipsToBounds
출들masksToBounds
자세한 내용은 UIView의 클립 ToBounds와 CALayer의 마스크 ToBounds의 관계를 참조하십시오.
이 질문은 이미 좋은 답을 가지고 있지만, 저는 더 많은 사진으로 그것을 보완하고 싶습니다.제 완전한 대답은 여기 있습니다.
액자를 기억하는 것을 돕기 위해 벽에 걸린 액자를 생각합니다.그림을 벽의 아무 곳이나 이동할 수 있는 것처럼 뷰 프레임의 좌표계는 수퍼 뷰입니다.(벽=감독, 프레임=뷰)
경계를 기억하는 데 도움을 주기 위해 농구장의 경계를 생각합니다.농구공은 시야 경계의 좌표계가 시야 내에 있는 것처럼 코트 내 어딘가에 있습니다.(코트=뷰, 농구/야구=뷰 안의 콘텐츠)
프레임과 마찬가지로 view.center도 수퍼뷰의 좌표에 있습니다.
프레임 대 한계 - 예제 1
노란색 사각형은 보기의 프레임을 나타냅니다.녹색 사각형은 뷰의 경계를 나타냅니다.두 영상의 빨간색 점은 좌표계 내 프레임 또는 경계의 원점을 나타냅니다.
Frame
origin = (0, 0)
width = 80
height = 130
Bounds
origin = (0, 0)
width = 80
height = 130
예 2
Frame
origin = (40, 60) // That is, x=40 and y=60
width = 80
height = 130
Bounds
origin = (0, 0)
width = 80
height = 130
예 3
Frame
origin = (20, 52) // These are just rough estimates.
width = 118
height = 187
Bounds
origin = (0, 0)
width = 80
height = 130
예 4
이는 보기의 경계에 잘리지 않은 것처럼 보이는 전체 보기 내용이 표시된다는 점을 제외하고는 예제 2와 동일합니다.
Frame
origin = (40, 60)
width = 80
height = 130
Bounds
origin = (0, 0)
width = 80
height = 130
예 5
Frame
origin = (40, 60)
width = 80
height = 130
Bounds
origin = (280, 70)
width = 80
height = 130
다시 말씀드리지만, 자세한 내용은 여기를 참조하십시오.
저는 이 이미지가 프레임, 경계 등을 이해하는 데 가장 도움이 된다는 것을 알았습니다.
또한 참고하시기 바랍니다.frame.size != bounds.size
이미지가 회전할 때 표시됩니다.
제 생각에 당신이 그것을 생각한다면.CALayer
모든 것이 더 명확합니다.
(bounds, position)에서 입니다.UIView
변신중심') 및 변환을 수행합니다.
따라서 기본적으로 레이어/뷰 레이아웃이 이 세 가지 속성(및 앵커포인트)에 의해 어떻게 결정되는지, 그리고 이 세 가지 속성 중 어느 것도 변환을 변경해도 경계가 변경되지 않습니다.
이 게시물에 대한 자세한 설명과 함께 매우 좋은 답변들이 있습니다.WWDC 2011 비디오 UIKit Rendering 이해 @4:22에서 20:10까지 프레임, 경계, 중심, 변환, 경계 원점의 의미에 대한 시각적 표현이 포함된 다른 설명이 있습니다.
위의 답변을 읽고, 여기에 나의 해석을 추가합니다.
웹 브라우저를 온라인으로 검색한다고 가정합니다.frame
웹 페이지를 표시할 위치와 크기를 결정합니다.브라우저의 스크롤러는bounds.origin
웹 페이지의 어느 부분을 표시할지 결정합니다. bounds.origin
이해하기 어렵습니다.가장 좋은 학습 방법은 단일 보기 응용프로그램을 만들고 이러한 매개변수를 수정하여 하위 보기가 어떻게 변경되는지 확인하는 것입니다.
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(100.0f, 200.0f, 200.0f, 400.0f)];
[view1 setBackgroundColor:[UIColor redColor]];
UIView *view2 = [[UIView alloc] initWithFrame:CGRectInset(view1.bounds, 20.0f, 20.0f)];
[view2 setBackgroundColor:[UIColor yellowColor]];
[view1 addSubview:view2];
[[self view] addSubview:view1];
NSLog(@"Old view1 frame %@, bounds %@, center %@", NSStringFromCGRect(view1.frame), NSStringFromCGRect(view1.bounds), NSStringFromCGPoint(view1.center));
NSLog(@"Old view2 frame %@, bounds %@, center %@", NSStringFromCGRect(view2.frame), NSStringFromCGRect(view2.bounds), NSStringFromCGPoint(view2.center));
// Modify this part.
CGRect bounds = view1.bounds;
bounds.origin.x += 10.0f;
bounds.origin.y += 10.0f;
// incase you need width, height
//bounds.size.height += 20.0f;
//bounds.size.width += 20.0f;
view1.bounds = bounds;
NSLog(@"New view1 frame %@, bounds %@, center %@", NSStringFromCGRect(view1.frame), NSStringFromCGRect(view1.bounds), NSStringFromCGPoint(view1.center));
NSLog(@"New view2 frame %@, bounds %@, center %@", NSStringFromCGRect(view2.frame), NSStringFromCGRect(view2.bounds), NSStringFromCGPoint(view2.center));
언급URL : https://stackoverflow.com/questions/5361369/uiview-frame-bounds-and-center
'programing' 카테고리의 다른 글
springapplication.properties 파일의 resources 폴더에 파일 지정 (0) | 2023.06.20 |
---|---|
마리아에서 항상 생성됨DB (0) | 2023.06.20 |
MariaDB가 한 데이터베이스에 대해 종속 하위 쿼리에 대해 색인을 사용하지 않지만 동일한 서버에 있는 다른 데이터베이스에는 사용하지 않음 (0) | 2023.06.15 |
하향식 및 상향식 프로그래밍 (0) | 2023.06.15 |
TensorFlow 2가 TensorFlow 1보다 훨씬 느린 이유는 무엇입니까? (0) | 2023.06.15 |