콘텐츠로 건너뛰기
Home » cocoa » Page 2

cocoa

트랙킹 캔버스 뷰 만들기 (Cocoa)

예전에 코어 그래픽을 사용해서 UIView위에 손가락으로 그림을 그릴 수 있는 간단한 핑거 드로잉 캔버스를 구현해본 바 있는데, 똑같은 내용을 NSView에 적용해보고자 한다. 이전글이 Objective-C로 작성되어 있는데, 이번에는 Swift로 간단하게 작성해보려 한다. 원리는 동일하다. CGLayer를 하나 만들고, 마우스를 사용해서 뷰를 긁을 때(드래그할 때)마다  코어 그래픽을 사용해서 레이어에 그림을 그리고, 다시 뷰 리드로잉 사이클에서는 뷰에 레이어를 그리는 것이다. class TrackDrawCanvasView: NSView { var previousPoint: NSPoint? = nil lazy var drawingLayer: CGLayer? = { [unowned self] in let cs = CGColorSpace(name:CGColorSpace.sRGB)! let ctx =… 더 보기 »트랙킹 캔버스 뷰 만들기 (Cocoa)

NSResponder – Cocoa에서 키보드 이벤트를 처리하는 방법

사용자가 키보드를 두드리면 macOS는 각 키 타이핑에 대한 키 이벤트를 받게 된다. 이벤트 처리의 기본은 이벤트에 대해서 그 이벤트를 핸들링하는 어떤 함수가 실행되는 것이다. 시스템에 들어온 키 이벤트를 누가 어떻게 처리하게 될까? 제 1 응답자 마우스 이벤트의 경우, 이벤트를 받아서 처리해야 하는 주체가 분명하다. 마우스는 마우스 포인터를 통해서 화면 상에 표시되는 뷰와 상호작용한다. 하지만 키보드 이벤트는 어떤가? 키보드 이벤트를 처리하는 주체는 상황과 문맥에 따라 달라질 수 있다. 다만 사용자로서 우리는 어떠한 경우에 어떤 뷰가 키보드 타이핑을 받을 수 있는지 알… 더 보기 »NSResponder – Cocoa에서 키보드 이벤트를 처리하는 방법

NSImage와 이미지 표현형에 대해 – Cocoa

코코아에서 이미지를 표현하는 클래스로 기본적으로 NSImage를 쓴다. 앱킷에서 이 클래스는 다양한 기본 포맷의 이미지에 대해서 사용할 수 있고, 이미지를 로드하거나, 이미지를 그리는 등의 거의 모든 작업에서 주로 사용되는 클래스이다. 사실 NSImage는 어떤 이미지값을 감싸는 wrapper인데, 우리의 상식과는 달리 이 클래스 자체는 자신의 내부에 들어있는 이미지 데이터에 대해서 별로 아는게 없다. 어떤 이미지는 단일 이미지 내에 표현형에 따라서 여러벌의 이미징 데이터를 가지고 있는 경우가 있기 때문에, NSImage는 이러한 데이터를 담는 일종의 배열처럼 동작할 뿐이고, 실제로 렌더링되는 이미지 데이터는 이미지 표현형 객체에… 더 보기 »NSImage와 이미지 표현형에 대해 – Cocoa

AutoLayout을 코드로 정의하기 (Swift)

오토레이아웃 오토레이아웃이 도입되기 이전에도 코코아 및 코코아터치에서는 상위뷰나 윈도가 크기가 변하는 경우에 하위 뷰들의 크기가 그에 따라 어떻게 변할 것인지를 결정해주는 방법이 있었다. 흔히 spring & struts라 불리는 오토리사이징 마스크가 그것이다. 하지만 오토 리사이징 마스크는 한 가지 문제가 있는데, 그것은 오토 리사이징 마스크는 수퍼뷰와 서브뷰 둘 사이의 관계만을 정의하기 때문에 이를 따라 뷰의 크기나 위치가 움직일 때 서브 뷰 간의 레이아웃이 흐트러질 수 있는 가능성이 매우 많다는 것이다. 그리하여 예전에는 화면의 회전이나 키보드가 올라오는 등의 과정이 발생하면[^0-1] 뷰의 크기가 전환되는데… 더 보기 »AutoLayout을 코드로 정의하기 (Swift)

Nib 파일로부터 UI 관련 객체를 로딩하기

nib 파일에서 뷰/뷰컨트롤러를 가져오기

UIView를 상속받은 커스텀 뷰를 작성할 때, 뷰의 서브 뷰들을 일일이 동적으로 구성하는 것보다 인터페이스 빌더를 통해서 구성하는 것이 더 편한 경우가 있다. 흔히 테이블 뷰의 셀에 쓰이는 뷰가 이런 식으로 구성하기 좋다.  코드 상으로 모든 뷰의 구성 요소들을 일일이 구성하고 초기화하는 것은 너무 번거로우니, 메인 스토리보드와는 별개의 nib 파일에 뷰를 세팅하고 이를 로드하는 방식으로 좀 더 간결하고 예쁘게 처리할 수 있는 방법이 있을지 고민해보자.더 보기 »Nib 파일로부터 UI 관련 객체를 로딩하기

테이블 뷰에서 드래그하여 재정렬하기 – Cocoa, Swift

도전과제 – 테이블 뷰에서 row를 드래그하여 재정렬해보자.

드래그 앤 드롭의 매커니즘과 구현방법에 대해서 살펴보았었는데, 그렇다면 테이블 뷰에서 드래그 앤 드롭으로 데이터의 순서를 임의의 순서대로 바꿀 수 있는가에 대해서 살펴보자.더 보기 »테이블 뷰에서 드래그하여 재정렬하기 – Cocoa, Swift

UI컨트롤의 활성화여부를 동적으로 결정하는 법 – Cocoa, Swift

NSUserInterfaceValidations 특정한 메뉴 항목이나 버튼, 테이블뷰, 텍스트뷰 및 텍스트 필드등이 특정한 조건에 따라 활성화/비활성화되어야 하는 경우에 이를 처리하는 전략으로는 두 가지 방법이 있다. 특정 조건값이 변경될 때 (변경지점에서, 혹은 옵저빙을 통해서) 관련된 컨트롤의 활성화 여부를 변경해주는 방법 특정 조건값을 계산 프로퍼티로 만든 후, 이를 코코아 바인딩으로 컨트롤의 enabled 키와 연결하는 방법 코코아에서는 이 외에도 컨트롤에 대한 유효성 검사 매커니즘을 별도로 가지고 있다. 컨트롤이 화면에 표시될 때, 해당 컨트롤의 타깃이 NSUserInterfaceValidations 프로토콜을 따르고 있다면 해당 프로토콜의 메소드를 호출하여 자신의 유효성 여부를… 더 보기 »UI컨트롤의 활성화여부를 동적으로 결정하는 법 – Cocoa, Swift

드래그 앤 드롭으로 콘텐츠 복사를 구현하기 – Cocoa, Swift

많은 코코아 관련 서적에서 복사/붙여넣기를 구현하는 다음 과정으로 드래그 앤 드롭을 소개하는데, 대부분이 어떤 이미지 뷰에 이미지를 끌어다 놓는 부분까지만 소개하고 있다. 아마도 드래그 앤 드롭 자체가 실제로는 상당히 복잡한 매커니즘이라 그런 듯 한데, 이번 글에서는 드래그 앤 드롭을 구현하기 위해서 소스 뷰와 타깃 뷰 그리고 전달되는 데이터 모델에 대해 어떤 클래스와 구현이 필요한지를 살펴보도록 하겠다.
더 보기 »드래그 앤 드롭으로 콘텐츠 복사를 구현하기 – Cocoa, Swift

(Cocoa | Swift) 문서기반 앱

NSDocument 코코아에서 도큐먼트 기반 앱은 Pages 등의 프로그램과 같이 단일 문서당 개별 윈도를 갖고 구동되는 앱이다. 이러한 앱은 다음의 특성을 가진다. 한 애플리케이션에서 문서의 개수만큼의 윈도를 열 수 있다. 앱은 여러 문서들을 관리하게 된다. 문서는 문서의 데이터 구조를 관리하며, 이러한 데이터를 표시하는 윈도우를 관리한다. 문서는 디스크에 문서의 데이터를 저장하고, 읽고, 새 문서를 시작하는 기능을 담당한다. 또한 iCloud에 문서를 저장하거나 옮기는 기능도 담당하게 된다. 도큐먼트 기반 앱은 단순한 유틸리티나 슈박스 앱과는 다른 구조를 가지고 있으며, 그만큼 복잡하고 많은 기능들을 제공해야 한다.… 더 보기 »(Cocoa | Swift) 문서기반 앱

복사-붙여넣기가 지원되는 클래스 작성하기 – Cocoa, Swift

복습

이전 시간에 macOS에서 클립보드를 통해서 복사와 붙여넣기를 통해서 뷰 혹은 앱간의 데이터를 교환하는 과정에 대해서 살짝 살펴보았다. 어떤 클래스의 객체가 클립보드로 복사되려면, 해당 클래스는 클립보드에게 어떤 타입의 데이터들을 넣어줄 수 있음을 알리고, 각 타입에 대한 데이터를 생성하여 클립보드에게 전달해주는 동작을 수행해야 하며, 이 동작은 NSPasteboardWriting에 정의되어 있다. 그리고 붙여넣는 시점에 특정한 클래스의 객체를 클립보드에 요청하면, 클립보드는 해당 클래스의 객체를 생성할 수 있는 타입들을 조사한 후, 조달 가능한 타입에 대응하는 데이터를 이용해서 해당 클래스 객체를 생성해 붙여넣는 쪽으로 전달해주게 된다. 즉 클립보드로부터 생성할 수 있는 클래스는, 객체를 생성할 수 있는 데이터의 타입과, 타입별 데이터를 전달받아 인스턴스를 만드는 방법을 알고 있어야 한다. 이 내용은 NSPasteboardReading에 정의된다.

복사/붙여넣기의 동작은 어떤 클래스로부터 이진데이터를 만들어서 클립보드에 올려놓고, 또 클립보드 데이터로부터 어떤 클래스를 만드는 일과 관련된다. 하지만 이것은 직렬화/역직렬화와는 다르다. 왜냐하면 복사/붙여넣기 동작은 앱과 앱 사이에서도 발생할 수 있는 일이기 때문이다. 따라서 데이터 공급과 소비의 관점에서 이해해야 하며, 이 때 오가는 데이터는 1가지 이상의 타입일 수 있다.

보통의 복사/붙여넣기 동작과 관련해서는 특수한 타입의 데이터보다는 일반적인 표준 클래스의 데이터를 더 많이 쓰게되므로 실질적으로 커스텀 클래스를 클립보드에 복사해넣는 일은 그리 많지 않다. 하지만 궁금해하지 말라는 법은 없으니, 복사/붙여넣기를 지원하는 커스텀 클래스를 어떻게 작성할 수 있는지에 대해서 알아보도록 하자. 

더 보기 »복사-붙여넣기가 지원되는 클래스 작성하기 – Cocoa, Swift