본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] 뷰 다시 그리기와 UIScrollView

by 돼지왕 왕돼지 2016. 2. 17.
반응형


[iOS Study] 뷰 다시 그리기와 UIScrollView


출처 : 아론 힐리가스의 iOS 프로그래밍

@end, @implementation, @interface, contentSize, dirty view, dragging, drawrect:, IOS, ios study, ios tutorial, iOS 프로그래밍, paging, pagingenabled, panning, Private, run loo, scrollview, scrollview paging, scrollview.pagingenabled, SDK, setNeedsDisplay, setNeedsDisplayInRect, touchesbegan:withevent:, touchesbeganwithevent, UIScrollView, UIView, [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;











반응형

댓글