프레임과 바운스에 대한 이해를 조금 더 깊게 하고요.

5202 단어 iOS
UIView의 프레임과 bounds는 모두 View의 사이즈와 위치를 결정하는 물건이지만, 상당히 현지에서 프레임을 사용하는 사람이 많지 않습니까?
다양한 사이트에서 프레임은 부모가 준 좌표/bounds는 자신의 좌표???라는 느낌을 받았다.
차이는 잘 모르겠는데 말하자면 왜 두 개가 있는 거야.
비록 나 자신도 아직 완전하지는 않지만, 나는 코드를 써서 이해하는 범위 내에서 총결산할 것이다.
이렇게 말하지만 프레임과 바운스만 이해하기 어렵다.
여기에 센터, 트랜스포머를 넣으면 이해하기 쉽다.
각자의 관계를 그림으로 정리하면 이런 느낌(수치는 좌표의 인상이 부정확하다)

부모 View에 회색 아이 View를 배치하여 위치·비례·회전을 적당히 transform으로 이동한 이미지입니다.
왼쪽 상단의 회색 테두리는 그리지 않아 부모 입장에서는 아이 뷰의 위치, 오른쪽 하단의 회색 테두리는 트랜스포머의 결과로 실제 그린 아이 뷰다.
center/bounds는transform 앞의 설정 좌표이고 프레임은transform 뒤의 묘사 좌표입니다.
(※ 손뷰를 고려하면 실제 위치를 그린다는 표현은 좋지 않아요...)
안드로이드에서 center/bounds는layout 좌표,transform은Animation에서 이동하고frame는Animation에서 이동한 후 그리는 좌표입니다.
따라서 반 크기 아이뷰를 추가하고 싶을 때 프레임을 사용하면 맛이 없다.
transform이 변경되고 크기가 변경되면 예상 동작이 되지 않습니다.
(10060) 뷰가 있다고 가정하고 절반(50,30) 크기의 아이 뷰를 추가하고 싶다.
만약 이때 화폭이transform의 두 배라면...?
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 60)];
view.transform = CGAffineTransformMakeScale(2, 2);   //2倍に

//さぁこのviewに大きさ半分のView(幅50, 高さ30)を追加するぞ

//だめな例。frameを使う
CGFloat childW = CGRectGetWidth(view.frame) / 2;
CGFloat childH = CGRectGetHeight(view.frame) / 2;
childView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, childW, childH)];
[view addSubview:childView];
//transformでviewの描画サイズが倍なので、childW=100,childH=60となり意図しない結果になる

//正しい例。boundsを使う
CGFloat childW = CGRectGetWidth(view.bounds) / 2;
CGFloat childH = CGRectGetHeight(view.bounds) / 2;
//この方法ならtransformに関わらずchildW=50, childH=30で意図通り
극단적인 예지만 프레임과 바운드의 결과는 현저히 다르다.
트랜스포머 이전의 사이즈를 원하는지 뒤의 사이즈를 원하는지 명확히 깨닫고 구분해서 사용하세요.
센터도 마찬가지다.
transform에서 위치 앞 위치를 이동해야 할 때center,
실제 그리는 위치를 보고 싶을 때 프레임을 사용하십시오.
또한 프레임을 적절하게 설정하는 것에 주의하세요.
특히 회전이 필요한 상황에서view의bounds가 어떻게 변할지 예측하기 어렵다
45도 회전 상태에서 프레임을 적당히 설정해 보세요.
frame의 변화는 이와 관련된center/bounds의 변화를 의미한다.
다음과 같은 문제가 발생합니다.

레드라인은 새 프레임입니다.그럼 그때 바운스 가격은 어떻게 됐나요?
파란색 세 줄은 바운스의 인상이다.
하지만 청선 3개의 사각형으로 설정된 프레임은 모두 만족하죠?
조건을 충족하는 값이 여러 개 존재하는데 어떻게 될지 모르겠다.
자신이 이런 코드를 써서 실험을 할 때 프레임 조작을 할 때 bounds가 비뚤어져 마지막에 bounds의 높이가 0이 되면 보이지 않는다.
나는 내부에서 반행렬 계산이 진행되고 있다고 생각하지만 결과는 예측하기 어렵다.
따라서 프레임으로 크기를 바꿀 때는 주의해야 한다.
물론 트랜스포머가 변하지 않은 상태를 알면 OK.
아직 잘 모르는 것은 bounds의origin이 (0,0) 이외로 변했을 때다.
왼쪽 위의 좌표라기보다는 센터의 편이다.
다만 아이뷰가 오프에 전혀 설정되지 않아 다소 까다로운 인상일 뿐이다.
(사용하는 장면이 있나.. 자세한 건 알려주세요..)

좋은 웹페이지 즐겨찾기