콘텐츠로 건너뛰기
Home » Development » Cocoa » Page 8

Cocoa

[iOS] UIDatePicker 사용법

UIDatePicker는 UIContoller의 서브클래스로 버튼(UIButton)이나 슬라이더(UISlider)와 같은 기능을 수행하는 단위 컨트롤이라 생각하고 사용하면 된다. 사용자가 날짜를 변경했을 때는 버튼이 눌러질 때와 마찬가지로 UI 단에서 컨트롤러로 메시지를 보내야 하므로 타깃-액션 매커니즘에 의해 메시지를 받을 수 있다. 일견 복잡해 보이나 다음과 같이 단순하게 생각하면 된다. 1. NSDate 유형의 날짜 정보를 사용자로부터 입력 받기 위해 사용하는 UI 단위이다. 2. IB에서 추가한 후, 여러 설정 (시간단위까지 입력할 것인지, 시간의 범위는 어떤지 등)을 바꿀 수 있다. 3. 날짜가 변경되었을 때 컨트롤러가 받을 메시지를 위해 IBAction 메소드를… 더 보기 »[iOS] UIDatePicker 사용법

[iOS] 아이콘의 자동 광택 효과 제거하기

iOS에서는 앱의 아이콘에 대해서 자동으로 모서리를 둥글게 잘라내고 광택 효과를 입혀주지만, 경우에 따라서는 아이콘의 광택 효과를 원하지 않을 수도 있다. 앱의 기본 Info.plist 파일 (앱이름-Info.plist로 Supporting FIles 폴더에 있음)을 열고, 키를하나 추가해준다. 키 이름, 타입, 값은 다음과 같다. Icon already includes glossy effects : boolean : YES (I자만 치면 자동으로 나타남) 이제 앱을 빌드해서 시뮬레이터에서 광택효과가 없이 matte하게 표시되는 아이콘을 볼 수 있을 것이다. *Xcode4에서는 이미 타겟 세팅에서 체크만 하면 된다. 앱 아이콘 끌어다 놓는 부분 오른쪽에 있으니 잘 찾아본다.

[코어그래픽] 비트맵 그래픽 컨텍스트

비트맵 그래픽 컨텍스트는 비트맵 이미지를 담는 그래픽 컨텍스트이다. CGImage를 바탕으로 새로운 레이어를 생성하거나, 혹은 레이어에 그려진 그래픽을 CGImage 구조체로 만들 때 사용한다. 쉽게 말해, 터치 드로잉 앱을 만든다고 하면, 캔버스가 되는 뷰는 비트맵 컨텍스트를 하나 준비해서, 손가락의 움직임을 따라 레이어에 선을 그린다. 그려진 내용을 이 비트맵 컨텍스트에 저장한 다음 뷰의 현재 컨텍스트에는 비트맵이미지를 그려준다. 그러면 여태까지 그린 내용을 전부 하나의 비트맵 이미지에 기록하여 그림을 실시간으로 그려줄 수 있다. (레이어를 그리고, 이를 바로 뷰에 그리면, 이전에 그렸던 내용이 보존되지 않는다.) 비트맵… 더 보기 »[코어그래픽] 비트맵 그래픽 컨텍스트

[Cocoa] 코어데이터 스택을 수동으로 세팅하기

코어데이터 코어데이터 코어데이터. 쉽지도 않은 내용인데 이 블로그에서 최근에 코어데이터를 지긋지긋하게 많이도 다루는 것 같다. ㅠㅡㅠ 하지만 언젠가는 피가되고 살이될 코어데이터에 대한 내용이다.
이미 “간단한” 저장은 아주 손쉽게 Keyed Archiver를 사용하여 인코딩한 객체를 파일로 바로 저장하는 것은 살펴보았다. 하지만 만약, 저장한 주소록에 사람이 수백만명이라면 엄청나게 많은 데이터가 앱이 실행될 때 한번에 메모리로 로드되어 올라갈 것이다. (이것이 아카이빙으로 내용을 저장할 때의 한계이다. 많은 데이터는 결국 한 번에 로딩해서 안고 있어야 하는 부담이 있다.)
하지만 코어데이터는 굉장히 빠르게 영구저장소를 계속해서 액세스하고, 자동으로 차등저장 및 로딩을 지원하기 때문에 데이터세트가 어느 정도까지는 커져도 괜찮다. (적어도 나는 그렇게 알고 있다.)
iOS라면 UIManagedDocument를 사용하면 문서파일 자체를 코어데이터 영구저장소 파일(데이터베이스 파일)로 바로 사용할 수 있다. 이 내용은 이미 살펴본 바가 있는데, 문제는 NSManagedDocument 라는 것은 아직 공식적으로 존재하지 않는 클래스이다. (아 이런…) 결국 코코아 앱을 시작할 때 코어데이터를 적용해주지 않으면… 콸콸콸콸…

update: macOS에서는 NSPersistentDocument 라는 클래스가 있어서 코어데이터와 NSDocument를 긴밀하게 통합하여 사용할 수 있다.

더 보기 »[Cocoa] 코어데이터 스택을 수동으로 세팅하기

NSView의 내용을 이미지로 캡쳐하기

  NSView의 내용을 비트맵 그래픽 파일로 캡쳐하는 방법에 대해 설명하겠다. 일전에 간략히 적어둔 내용이 있었는데, 잘못된 부분도 있고 예전엔 돼었는데 제대로 동작 안하는 부분도 있어서 다시 정리한다. PDF로 캡쳐하는 방법도 있으니 살펴보도록 하자. 이미지를 만든다기 보다는 특정한 포맷으로 표현할 수 있은 이미지 표현형을 획득할 수 있으면(NSBitmapImageRep) 이 클래스의 representation(using:properties:)를 사용해서 이미지 파일을 위한 데이터를 생성할 수 있다. 여기에는 크게 두 가지 방법이 있다. 뷰 자체를 캡쳐하는 NSBitmapImageRep의 이니셜라이저를 사용하기 뷰의 비트맵 캐시를 추출하기 첫번째 방법은 NSBitmapImageRep의 이니셜라이저 중에서 init(focusedViewRect:)를 사용하는… 더 보기 »NSView의 내용을 이미지로 캡쳐하기

[Cocoa] 여러 이미지를 이어 붙이기

찾으면 찾으면 있겠지만, 손쉽게 여러 장의 이미지를 가로나 세로로 이어 붙여서 하나로 만들어주는 그런 앱이 있으면 참 좋겠다고 생각하다가, 까짓거 하나 만들면 되지 않겠냐 -_- 고 생각이 들어서 써보는 그런 포스팅 이미지 이어 붙이기 앱을 처음부터 끝까지 만들어보기에는 너무 힘든 포스트가 될 것 같아서, 여러 개의 NSImage를 이어붙이는 부분에 대해서만 살펴보기로 하자 대략의 구상 그러니까 레이어(CGLayer)같은 곳에는 이미지를 원하는 크기로 붙여넣을 수 있으니, 이미지(NSImage)들을 CGImage로 바꾸고, 최종 크기의 비트맵 컨텍스트를 만들어 여기에 이미지들을 각각 그려서 이 컨텍스트로부터 비트맵 이미지(CGImage)를 얻어서… 더 보기 »[Cocoa] 여러 이미지를 이어 붙이기

[Cocoa] NSImage를 파일로 저장하기

NSImage를 파일로 저장하기 이미지를 파일로 저장하기 위해서는 ‘표현형식'(representation)에 대해 알아야 한다. 즉 이미지 자체는 일련의 픽셀을 모아둔 데이터인데, 우리가 흔히 알고 있는 JPG, PNG 등의 파일 포맷은 이 이미지를 각각 정해진 방식으로 ‘정리’하여 파일에 저장하기 때문이다. 표현형식은 이런 파일에 저장된 비트맵 데이터를 다시 이미지로 렌더링하는 역할을 하고, 그 반대의 역할도 수행할 수 있다. NSImage는 1) TIFFRepresentation 메소드를 사용하여 표현형식을 구성하는 데이터로 만든다. 이 데이터를 사용하여 2) NSBitmapImageRep 객체를 생성하고, 이 객체에서부터 3) 실제 저장이 가능한 그래픽 파일 포맷의 데이터를 생성해서… 더 보기 »[Cocoa] NSImage를 파일로 저장하기

[iOS] 코어그래픽에 손대기

코어그래픽은 뷰에 그림을 그리는 기술이다. 하지만 C로 짜여진 API에 온갖 혼란스러운 함수명하며, 컨텍스트와 같은 어려운 개념들이 들어가면서 나와 같은 초보자에게는 마치 ‘넘을 수 없는’ 장벽과 같이 느껴진다. 하지만 많은, 정말 많은 튜토리얼들이 코어그래픽을 사용해서 그림을 그리는 이유는 명확하다. 바로 “아주 빠르기” 때문이다. 코어 그래픽은 그래픽 메모리의 버퍼를 직접 다루므로 아주 빠르다. (다만 일부 기기에서는 느리기도 하더라 ㅠㅠ) 오늘은 “시작하는 마음가짐”으로 코어 그래픽에 대해 잠깐 살펴보도록 하자.
코어그래픽을 사용하는데는 ‘컨텍스트’라는 개념을 이해해야 하는데, 이는 뒤에서 설명하기로 하고 잠시동안 ‘컨텍스트’는 그림을 그리는 도화지, 혹은 포토샵에서의 레이어와 같다고 간주하자.
더 보기 »[iOS] 코어그래픽에 손대기

[iOS/OSX] predicate를 사용한 배열의 필터

배열을 필터하기 특정한 값을 만족하는 원소만을 추출하여 부분 집합을 구하는 작업을 종종 해야 할 때가 있다. 배열에 대한 정렬 보다 간단하다면 간단하고 어렵다면 어려운데, predicate를 사용하면 쉽게 추출이 가능한데, 이 predicate를 사용하는 문법이 별도로 존재하기 때문에 조금 성가실 수 있다. (하지만 영문법과 크게 다르지 않다) NSMutaleArray *array = [NSMutableArray arrayWithObjects:@”Bill”, @”Ben”, @”Chris”, @”Melisa”, nil]; NSPredicate *bPredicate = [NSPredicate predicateWithFormat:@”SELF beginsWith:’b'”]; NSArray *beginWithB = [array filteredArrayUsingPredicate:bPredicate]; // ==> { @”Bill”, @”Ben” } predicate는 너무 깊이 파면 복잡하므로 일종의 쿼리문이며, 대략 다음과… 더 보기 »[iOS/OSX] predicate를 사용한 배열의 필터

[iOS_OSX] 배열을 정렬하기

배열을 정렬하기

배열을 정렬하는 거 언젠가는 써 먹겠지 싶어서 정리.
생각보다 자주 써먹게 되더라

배열을 정리하는 방식은 크게 세 가지로 1)디스크립터를 사용하거나 2)블럭, 3)셀렉터를 사용하는 방법이 있다. 각각이 표현의(?) 차이는 있는데 실제로는 각 요소들을 비교하여 어떤 것이 앞에 오는지를 비교하여 정렬하게 된다.더 보기 »[iOS_OSX] 배열을 정렬하기