[iOS Study] 뷰 다시 그리기와 UIScrollView |
-
사용자가 뷰를 터치하면 뷰는 touchesBegan:withEvent: 메시지를 받는다.
-
iOS 앱이 실행되면 런 루프가 시작된다.
런 루프의 역할은 터치 등의 이벤트를 대기하는 것이다.
런 루프는 이벤트가 발생하면 그 이벤트에 관한 적당한 핸들러 메소드를 찾는다.
그 핸들러 메소드는 해당 기능을 수행하는 다른 메소드들을 부른다.
메소드가 모두 완료되면 제어는 다시 런 루프로 돌아간다.
런 루프가 다시 제어권을 얻으면 갱신해야 할 뷰(dirty view) 목록을 확인한다.
이 뷰들은 가장 최근 이벤트 처리 과정에서 발생한 내용들을 기반으로 다시 그려져야 한다.
그래서 런 루프는 뷰 계층의 모든 것들이 다시 합성되기 전에 이 목록에 있는 뷰들에 drawRect: 메시지를 보낸다.
-
갱신해야 할 뷰 목록에 뷰를 추가하려면 setNeedsDisplay 메시지를 뷰에 보내야 한다.
iOS SDK 일부인 UIView 의 하위 클래스들은 그들 자신에게 내용이 변경될 때마다 setNeedsDisplay 를 보낸다.
예를 들어 UILabel 인스턴스는 setText: 메시지를 받으면 자신에게 setNeedsDisplay 메시지를 보낸다.
직접 만든 UIView 의 하위 클래스들은 반드시 setNeedsDisplay 메시지를 자신에게 보내야 한다.
-
뷰의 일부만을 다시 그리도록 지정할 수 있다.
setNeedsDisplayInRect: 메시지를 부에 보내면 된다.
갱신할 부에 drawRect: 를 보낼 때, 지금껏 무시했던 이 메소드의 인자가 setNeedsDisplayInRect: 에 보내질 사각형이 된다.
일부를 다시 그리는 것은 전반적으로 성능이 크게 향상되지 않고 결국 더 어려운 작업을 하게 되는 것이다.
그래서 대다수 사람들은 드로잉 코드로 앱이 느려지지 않는 한 이를 신경쓰지 않는다.
-
클래스 확장에서 프로퍼티를 선언하는 것과 헤더 파일에서 선언하는 것은 어떤 차이점이 있을까? 그 답은 가시성이다.
-
클래스 헤더 파일은 다른 클래스에서 볼 수 있다.
클래스는 다른 클래스가 이 클래스나 인스턴스와 통신할 수 있는 법을 선전하기 위해 헤더 파일 안에 프로퍼티와 메소드를 선언한다.
하지만 모든 프로퍼티와 메소드를 공개하는 것은 아니다.
클래스 내부에서 사용할 프로퍼티와 메소드들은 클래스 확장에 둔다.
다른 클래스는 이 프로퍼티에 대해 알 필요가 없다.
따라서 이 프로퍼티는 클래스 확장에 속한다.
-
클래스 확장은 구문상으론 헤더 파일과 약간 비슷해 보인다.
@interface 로 시작하여 끝에 빈 괄호가 온다.
@end 는 클래스 확장의 끝을 표시한다.
보통 메소드 정의의 시작을 알리는 @implmenetation 키워드 앞인 구현 파일의 맨 위에 클래스 확장을 놓는다.
-
하위 클래스에도 동일한 가시성 규칙이 적용된다.
하위 클래스를 만들었다면 그 하위 클래스와 인스턴스는 상위 클래스의 확장 프로퍼티와 메소드를 볼 수 없다.
-
스크롤뷰는 보통 화면보다 뷰가 클 때 사용한다.
스크롤뷰는 하위뷰의 사각 영역의 일부를 그린다.
그리고 스크롤뷰에서 사용자가 뷰를 상하좌우로 움직이면(panning) 그 하위뷰의 사각 영역 위치가 바뀐다.
따라서 스크롤뷰를 여기저기 이동할 수 있는 뷰 포트로 생각할 수 있다.
스크롤뷰의 크기는 이 뷰 포트의 크기이다.
스크롤뷰가 보여주는 영역의 크기는 contentSize 에 설정하는데 이는 보통 UIScrollView 하위뷰의 크기이다.
-
스크롤뷰는 페이징(paging) 옵션을 갖는다.
아래와 같은 코드로 view 들간 paging 효과를 얻을 수 있다.
scrollView.pagingEnabled = YES;
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] 델리게이션과 텍스트 입력 (0) | 2016.02.19 |
---|---|
[iOS Study] 뷰 컨트롤러 (0) | 2016.02.18 |
[iOS Study] 뷰와 뷰 계층구조 (0) | 2016.02.16 |
[iOS Study] ARC 를 통한 메모리 관리 (0) | 2016.02.15 |
[iOS Study] Objective-C (0) | 2016.02.13 |
댓글