티스토리 뷰
[UIView] layout 변경, setNeedsLayout, layoutIfNeeded, drawRect, sizeToFit, sizeThatFits
beankhan 2016. 8. 20. 18:28레이아웃 변경이 발생하는 시점
UIView 의 크기가 변경되면, 크기가 변경된 UIView 의 서브뷰들은 위치와 크기가 조정되어야 한다.
UIView 는 이를 위해 자동과 수동으로 UIView 의 layout을 조정하는 방법을 제공한다.
다음의 이벤트에 레이아웃 변경이 발생한다.
|
setNeedsLayout
간단히 말해서 'needLayout' flag를 YES로 셋팅하는 역할을 한다.
이 플래그의 역할은 해당 뷰가 새로 layout이 필요함을 알려주는 것이다.
따라서 해당 뷰가 redraw되는 시점에서 layoutSubViews가 호출되게 된다.
대부분의 경우 setNeedsLayout을 직접 호출할 필요는 없다.
왜냐하면 UIView의 autoresizesSubviews 프로퍼티의 디폴트 값이 YES이기 때문에,
뷰의 프레임이 변할 때마다 자동으로 subview들도 layoutSubviews 가 되어 redraw 되기 때문이다.
layoutIfNeeded
needLayout flag가 YES일 때, 뷰가 redraw 되는 시점까지 기다리지 않고
지금 당장 바로 redraw 시키고 싶을 때 호출한다.
drawRect
뷰에 무언가를 그릴 때는 drawRect: 함수를 이용하게 된다.
뷰의 내용, 혹은 뷰의 하위 뷰의 어떤 그래픽적인 변경이 있어서
뷰를 업데이트 해야 할 필요가 있을 때 이 메소드가 호출된다.
View 에 어떤 내용을 그리는 것은 성능 상 이슈로 반드시 drawRect: 에서만 해야한다.
sizeToFit, sizeThatFits
보통 값을 셋팅하고 sizeToFit을 할 것이다. sizeToFit을 하면 sizeThatFits가 불린다.
그리고 sizeThatFits에서 서브뷰의 크기를 건드리거나 뷰를 붙이거나 떼거나 등의 일을 하면 layoutSubViews도 불린다.
그러나 그런 일을 하지 않는다면 layoutSubViews는 자동으로 불리지 않는다.
따라서 만약 sizeThatFits에서 서브뷰의 크기 셋팅이 다 동일하더라도 layout을 다시 해야할 필요가 있다면
(ex: 상태값에 따라 서브뷰를 히든시키고 그에 따라 레이아웃을 바꾸는 등등)
layoutSubViews를 부르기 위하여 setNeedsLayout 혹은 layoutIfNeeded를 직접 불러주어야 한다. (이때 layoutSubviews를 직접 호출하면 안된다.)
View 의 실제 크기를 구해오려면?
http://stackoverflow.com/questions/27653247/how-to-get-real-size-uiview-with-autolayout
참고
https://soulpark.wordpress.com/2012/12/01/adjusting-the-sie-and-position-of-views-at-runtime/
http://egloos.zum.com/lilypad/v/1130363
http://soooprmx.com/wp/archives/2380
http://stackoverflow.com/questions/27653247/how-to-get-real-size-uiview-with-autolayout
'iOS 개발 > iOS' 카테고리의 다른 글
[iOS] preferredMaxLayoutWidth, Intrinsic content size, Content hugging priority, content Compression resistance priority (0) | 2016.08.22 |
---|---|
[UIView] UIViewContentMode 의 이해 (0) | 2016.08.20 |
[iOS8] Today Extension (Widget) 개념 및 제약사항, 앱과의 데이터 공유 (0) | 2016.07.24 |
Bridge (NS - CF) (0) | 2016.07.24 |
[iOS9] App Transport Security 대응방법, ATS 안전한 연결 조건 (0) | 2016.07.24 |
- Total
- Today
- Yesterday
- Swfit
- Swift
- NSManagedObject
- RunLoop
- AWS
- CIImage
- UIView
- Block
- HTTP
- dictionary
- Swift 3.0
- coredata
- string
- delegate
- Swift3
- NSManagedObjectModel
- 읽기 좋은 코드가 좋은 코드다
- docker
- set
- applicationWillResignActive
- CGImage
- Swift 3
- ios
- workerThread
- Arc
- thread
- 꺼내먹어요
- NSManagedObjectContext
- EffectiveObjectiveC
- optional
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |