iOS에서 언제 setNeedsDisplay를 호출해야합니까?
iOS 앱을 만들 때 정확히 언제 전화해야 setNeedsDisplay
하나요? UI 업데이트 / 다시 그리기와 관련이 있다는 것을 알고 있습니다. 그러나 내 견해를 변경할 때마다 이것을 호출해야합니까?
예를 들어 다음과 같이 호출해야합니까?
- 텍스트 필드의 텍스트를 프로그래밍 방식으로 변경 한 후
- 보기의 배경을 변경할 때?
- viewDidLoad를 변경할 때?
- viewDidAppear에서는 어떻습니까?
누군가이 방법을 사용할 때에 대한 일반적인 지침을 줄 수 있습니까?
UIView의 하위 클래스에서 drawRect를 재정의하는 경우에만 setNeedsDisplay를 호출해야합니다. UIView의 하위 클래스는 기본적으로 선, 이미지 또는 직사각형과 같은 모양과 같은 화면에 무언가를 그리는 사용자 지정 뷰입니다.
따라서이 드로잉이 의존하는 몇 가지 변수를 변경할 때 setNeedsDisplay를 호출해야하며 뷰가 해당 변경 사항을 나타내려면 내부적으로 drawRect를 호출하고 구성 요소를 다시 그리는이 메서드를 호출해야합니다.
imageView 또는 UIButton을 하위보기로 추가하거나 하위보기를 변경할 때이 메서드를 호출 할 필요가 없습니다.
예:
움직이는 원을 표시하는보기가 있습니다. 터치하고 이동하거나 타이머 기반 애니메이션 일 수 있습니다. 이제이를 위해 주어진 중심과 주어진 반지름으로 원을 그리는 사용자 정의보기가 필요합니다. 이들은 중심을 변경하여 원을 이동하거나 반경을 증가시켜 더 크게 만들도록 수정 된 인스턴스 변수로 유지됩니다.
이제이 경우 루프와 타이머에서 이러한 변수 (중심 또는 반경)를 수정하거나 touchesEnded 및 touchesMoved 메서드에서 손가락을 사용할 수 있습니다. 이 속성의 변경 사항을 반영하려면 setNeedsDisplay를 호출 할이 뷰를 다시 그려야합니다.
-setNeedsDisplay
.NET으로 콘텐츠를 그리는 UIView 하위 클래스 만 호출 하면됩니다 -drawRect:
.
레이블 및 기타 표준 컨트롤의 경우 텍스트를 변경하면 레이블이 자동으로 다시 그려 지므로 직접 수행 할 필요가 없습니다.
setNeedsDisplay:
뷰를 명시 적으로 새로 고침하려면 호출해야합니다. 내부 플래그 만 설정하고 iOS UI 시스템은 drawRect:
나중에 적절한 시간에 호출 합니다.
프레젠테이션을 변경할 수있는 속성을 업데이트 할 때 항상 호출되어야하는 것처럼 들립니다. 하지만 그렇지 않습니다. 거의 모든 표준 UI 컨트롤이 이미이를 처리했습니다. 표준 UI 구성 요소 (보기)의 속성을 수정할 때마다 setNeedsDisplay:
내부적으로 트리거되고 영향을받는 영역이 다시 그려 질 것이라고 생각합니다. (당신이 나열한 모든 상황에서)
그러나 자신 만의 뷰를 만들고 자체를 구현하고 drawRect:
무언가가 변경되었을 때이를 업데이트하려면 setNeedsDisplay:
명시 적으로 호출해야합니다 .
@Amogh Talpallikar가 그것을 명확하게한다고 생각합니다. 그리고 한 가지 더 논의하고 싶습니다.
사실, drawRect
성능이 저하 될 수 있으므로 실제로 필요하지 않는 한 재정의를 피해야 합니다. https://yalantis.com/blog/mastering-uikit-performance/를 참조 할 수 있습니다.
당신은 단지 프레임, 버튼, 라벨의 위치를 변경 싶다면, ... 당신이 호출 할 수 있습니다 setNeedLayout
또는layoutIfNeeded
보기 사용자 정의 도면이 종속 된 특성을 변경할 때 setNeedDisplay를 호출합니다. drawRect : 메서드를 강제로 명시 적으로 호출합니다.
참고 URL : https://stackoverflow.com/questions/10818319/when-do-i-need-to-call-setneedsdisplay-in-ios
'Program Tip' 카테고리의 다른 글
세션 변수로 배열 (0) | 2020.11.23 |
---|---|
MySQL 용 이스케이프 문자열 Python (0) | 2020.11.23 |
해결되지 않은 외부 기호 "public : virtual struct QMetaObject const * __thiscall Parent (0) | 2020.11.22 |
런타임에서 제약 조건 우선 순위를 어떻게 변경할 수 있습니까? (0) | 2020.11.22 |
NSData를 Swift에서 [Uint8]로 (0) | 2020.11.22 |