콘텐츠로 건너뛰기
Home » OSX

OSX

코코아 바인딩의 기초

MVC 패턴에서 프로그래머가 가장 많이 작성하는 코드는 크게 두 가지인데, 하나는 모델 데이터에서 발생한 변경을 뷰에 반영하는 것이고, 다른 하나는 뷰에서 사용자의 조작에 의해서 변경된 값을 모델 데이터에 반영하는 것이다. 사실 이것이 MVC에서 컨트롤러가 수행하는 일이다. GUI프로그램을 작성할 때 가장 많이 하게되는 이러한 작업을 조금 더 간단하게 (가급적이면 코드를 작성하지 않고) 구현하는 방법이 있으면 제법 편하지 않을까? 이럴 때 사용하는 코코아 바인딩은 Cocoa에서 macOS에서 데이터 모델과 뷰 사이의 양방향 연결을 만드는 일종의 ‘마법’이다. 예를 들어 아래 그림과 같은 간단한 앱을… 더 보기 »코코아 바인딩의 기초

커스텀 뷰로 만든 UI 컴포넌트의 포커스링 그리기 – Cocoa

포커스 링

코코아 UI 요소에서 현재 포커스를 받은 UI 컴포넌트는 외부에 흐릿한 푸른 색 후광이 그려지며, 현재 포커스를 받고 있는 입력 디바이스라는 점을 시각적으로 피드백한다.  시중의 코코아 관련한 대부분의 책에서는 다음과 같이 draw: 메소드 내에서 포커스링을 그리는 것으로 포커스링을 흉내낼 수 있다고 한다. 1

override func draw(_ dirtyRect: NSRect) {
    // 배경을 칠하고,
    super.draw(dirtyRect)
    self.bgColor.set()
    NSBezierPath.fill(bounds)
    // 자신이 속한 윈도에서 자기가 제1응답자라면?
    if let fr = window?.firstResponder, fr === self {
        // 포커스 컬러로 세팅하여, 자신의 테두리 영역을 그린다.
        NSColor.keyboardFocusIndicatorColor.set()
        NSBezierPath.setDefaultLineWidth(4.0)
        NSBezierPath.strokeRect(bounds)
    }
}

그리고 제 1 응답자가 되었을 때 포커스링을 그리기 위해서는 뷰가 응답자 상태에 진입하거나 빠져나올 때마다 뷰를 새로 그리도록 갱신해야 한다.

override var acceptsFirstResponder: Bool { return true }
override func resignFirstResponder() -> Bool {
    NSLog("Resigning...")
    setNeedsDisplay(bounds)
    return true
}
override func becomeFirstResponder() -> Bool {
    NSLog("Becoming...")
    setNeedsDisplay(bounds)
    return true
}

더 보기 »커스텀 뷰로 만든 UI 컴포넌트의 포커스링 그리기 – Cocoa

(Swift) iOS, OSX에서 이미지 저장하기

이미지를 저장하기

이미지를 JPEG, PNG 데이터로 만드는 것은 UIKit의 표준함수를 이용할 수 있다.

func UIImageJPEGRepresentation(_ image: UIImage!, _ compressionQuality: CGFloat) -> NSData!
func UIImagePNGRepresentation(_ image:UIImage!) -> NSData!

이를 이용해서 데이터를 저장할 수 있다. NSData로 만들어서 그냥 저장하면 되니까.

func saveImage(image: UIImage, toURL url: NSURL, withFormat format:ImageSavingFormat = .PNG) {
    let data: NSData
    switch format {
    case .PNG:
        data = UIImagePNGRepresentation(image)
    case .JPEG:
        data = UIImageJPEGRepresentation(image, 1.0)
    }
    var error: NSError?
    data.writeToURL(url, atomically: false, error: &error)
    if error != nil {
        println("Fail to save image")
    } else {
        println("successfully saved.")
    }
}

더 보기 »(Swift) iOS, OSX에서 이미지 저장하기

코코아 바인딩이란

코코아 바인딩

기능적인 측면에서 가장 단순하게 설명하면, 코코아 바인딩은 모델과 뷰 사이에 어떠한 글루코드 없이 값과 디스플레이되는 것을 동기화시키는 것이다. 즉 바인딩을 구성하면 코드상에서 어떤 프로퍼티의 값이 변경될 때 별도의 업데이트 코드를 작성하지 않더라도 자동으로 뷰가 업데이트되고, 반대로 뷰에서 사용자가 값을 조작하는 이벤트가 발생하면 역시 아무런 코드가 없더라도 연결된 프로퍼티 값이 변경되게 하는 것이다.

코코아 바인딩은 코코아의 기본 기술들을 결합하여 구현되는데, 작성/유지해야 하는 코드의 양을 최소화하면서 뷰와 모델간의 바인딩을 거의 공짜로 제공한다. 클래스를 작성할 때, 키밸류 컨벤션만 따랐다면, 코코아 바인딩을 적용하기 위해서 기존 코드를 재작성할 필요도 없다.

더 보기 »코코아 바인딩이란

Mac App’s Core Objects

App Life Cycle

여느 C 프로그램과 같이1 OSX앱도 main 함수로부터 시작한다. 이 함수는 단순히 NSApplicationMain() 함수를 다시 호출한다. 대략 이렇게 생겼다.

#import <Cocoa/Cocoa.h>
int main(int argc, const char* argv[]) {
    return NSApplicationMain(argc, (const char**) argv);
}

NSApplicationMain 함수는 앱을 초기화하고 실행할 준비를 한다. 초기화 과정의 일환으로 이 함수는 아래와 같은 작업을 한다.

  1. NSApplication 클래스 객체를 하나 만든다. 이 객체는 +sharedApplication 메소드로 얻을 수 있다.
  2. Info.plist 파일을 읽어들여서 여기에 기록된 NSMainNibFile로부터 nib 파일을 읽어들인다. 만약 스토리보드를 쓰고 있다면 기본 스토리보드를 읽어와서 객체들을 구성한다. UIApplicationMain과는 달리 앱 델리게이트는 기본 Nib 파일에 반드시 포함되어 있어야 한다.
  3. 애플리케이션 객체의 run 메소드를 호출한다. 이로써 론칭과정은 끝나고 앱의 이벤트 처리를 시작한다.

더 보기 »Mac App’s Core Objects

NSApplicationMain

NSApplicationMain int NSApplicationMain(int argc, const char* argv[]); 코코아 앱이 실행될 때 main 함수가 곧장 호출하는 함수로, 앱 객체를 생성하고 앱의 런칭 과정을 처리한다. 앱 객체의 클래스는 무조건 NSApplication이며, 앱 델리게이트는 nib 파일 내에 정의되어 있어야 한다. (iOS는 앱 델리게이트 클래스명을 전달하는 인자 부분이 마련되어 있음) argc, argv 파라미터가 정의되어 있지만, 실제로 값을 전달해도 무시한다. 코코아 내에서는 프로그램 실행시의 arguments를 _NSGetArgv, _NSGetArgc, _NSGetEnviron 함수들을 통해서 얻어야 한다.

OSX Quicklook 플러그인 모음

https://github.com/sindresorhus/quick-look-plugins brew cask를 사용해서 설치한다. brwe cask를 설치하는 방법은… $ brew update; brew install caskroom/cask/brew-cask 그리고 이를 사용해서 각 플러그인을 설치하면 된다. 소스코드 컬러링을 해주는 qlcolorcode의 경우 $ brew cask install qlcolorcode 와 같이 설치한다. 참고로 훑어보기 상에서 문자 선택 및 복사가 가능하게 하려면 터미널에서 다음과 같이 입력한다. $ defaults write com.apple.finder QLEnableTextSelection -bool TRUE; killall Finder

맥의 부팅음을 없애는 방법

맥 특유의 부팅음은 PC계열의 삑- 하는 소리보다는 아름답지만, 도서관 등의 공공장소에서 재부팅이라도 한 번 할라치면 참 난감하다. (생각보다 이 부팅음의 소리는 큰 편이더라.) 맥 부팅음을 없애주는 앱 같은 것도 나와 있는 것 같던데. 암튼, 누군가는 이런 게 분명 필요한 모양이다. 이 부팅음을 영영 안나오게 하는 건 서드파티 앱 없이도 할 수 있다. 터미널을 열고 다음과 같이 입력한다. sudo 명령을 쓴다는 것은 이 명령을 입력하고 엔터를 친 후, 비밀 번호를 물어보게 된다. sudo nvram SystemAudioVolume=%80 입력 후 자신의 로그인 계정의 비밀번호를… 더 보기 »맥의 부팅음을 없애는 방법

맥이 느려졌을 때 응급조치 방법

페이스북 노트에 정리했던 내용인데 블로그에 옮겨 발행. 맥은 기본적으로 유지보수가 쉽다. 윈도처럼 레지스트리가 꼬인다거나 하는 문제도 없고 전반적인 시스템 자원 관리도 윈도에 비해서는 매우 효율적이다. 그럼에도 불구하고 맥을 쓰다보면 이런 저런 이유로 느려지는 경우가 생길 수 있다. 이 때 원인과 대처 방법을 정리해본다. 1. 폰트 너무 많은 폰트가 설치된 맥은 느려진다. 많은 사용자들의 경험에 따르면 통상 300개 가량의 폰트 수량에서부터 급격한 성능 저하가 일어난다고 한다. 사용하지 않는 폰트는 서체 관리자를 통해 지우는 게 좋다. 일반적으로 시스템을 가볍게 쓴다면서 다른 언어를… 더 보기 »맥이 느려졌을 때 응급조치 방법

코코아 애니메이션 예제

코코아 애니메이션 예제 코코아 애니메이션을 사용하여 창의 투명도를 변화시키는 예제. 애플 개발자 문서에서 구할 수 있다. 주요내용은 마우스가 들어오면 불투명해지고 마우스가 나가면 몇 초 후부터 서서히 투명해져 10%까지 투명해지는 창을 만든다. 창의 제어를 위해서 NSWindowController를 사용하고 있으며, NSTrackingArea를 사용하고 있다. //마우스가 들어오면 불투명하고, 마우스가 나가면 약간의 딜레이 후 투명해지는 애니메이션을 구현한다. // InspectorController.h #import <Cocoa/Cocoa.h> @interface InspectorController : NSWindowController { NSTimer *fadeTimer; } @end // InspectorController.m #import “InspectorController.h” @implementation InspectorController -(id)init { self = [super initWithWindowNibName:@”Inspector”]; // Inspector.xib 파일이 있어야… 더 보기 »코코아 애니메이션 예제