programing

UIView 프레임, 경계 및 중심

goodsources 2023. 6. 20. 21:34
반응형

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, bounds and center

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)그러나 그 이후로view2frame 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]));

상대 이미지.

enter image description here

대신 내가 바뀌면 어떻게 되는 거지?[self view]다음과 같은 경계

// previous code here...
CGRect rect = [[self view] bounds];
rect.origin.x += 30.0f;
rect.origin.y += 20.0f;
[[self view] setBounds:rect];

상대 이미지.

enter image description here

당신이 말하는 것은[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

enter image description here


예 2

Frame
    origin = (40, 60)  // That is, x=40 and y=60
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here


예 3

Frame
    origin = (20, 52)  // These are just rough estimates.
    width = 118
    height = 187

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here


예 4

이는 보기의 경계에 잘리지 않은 것처럼 보이는 전체 보기 내용이 표시된다는 점을 제외하고는 예제 2와 동일합니다.

Frame
    origin = (40, 60)
    width = 80
    height = 130

Bounds 
    origin = (0, 0)
    width = 80
    height = 130

enter image description here


예 5

Frame
    origin = (40, 60)
    width = 80
    height = 130

Bounds 
    origin = (280, 70)
    width = 80
    height = 130

enter image description here

다시 말씀드리지만, 자세한 내용은 여기를 참조하십시오.

저는 이 이미지가 프레임, 경계 등을 이해하는 데 가장 도움이 된다는 것을 알았습니다.

enter image description here

또한 참고하시기 바랍니다.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

반응형