iOS 고급 오토레이아웃(auto layout)

본 글에서는 기본적인 오토레이아웃 튜토리얼들에서 잘 다루지 않는 커스텀 뷰에 오토레이아웃(auto layout)을 적용하는 방법과, 전반적으로 레이아웃 시스템이 어떻게 동작하는지를 중심으로 설명해보도록 하겠다. 오토레이아웃의 종류나 기본적인 적용방법들은 다른 좋은 튜토리얼들이 많으니 다루지 않을 예정이다. AutoLayout Programmatically 사용하기 개인적으로 오토레이아웃을 사용할 때도 인터페이스빌더를 되도록이면 쓰지 않으면서 코드만로 작성하는 방법을 선호한다. 애플에서 제공하는 NSLayoutConstraint 의 경우 가독성이 매우 떨어지는 단점이 있고, 이를 보완하기 위한 Visual format language 가 있지만, 이 또한 아주 직관적인 편은 아니며 문자열을 그대로 사용하기때문에 오타의 위험성도 존재한다. 이래저래 알아본 결과 Masonry라는 라이브러리가 그나마 가장 직관적이면서 가독성이 좋아 오토레이아웃 제약조건 코드를 작성할때 만족하며 사용중이다. Swift에서 사용을 원한다면 동일한 사람이 개발한 SnapKit을 사용하면 된다. ...

2014년 6월 18일 · 6분 · 1128단어

Cocoa Binding Controller Keys

코코아 바인딩 컨트롤러의 경우 최소한의 코딩만으로 model값이 변화할때 view와 model 사이의 싱크를 맞춰주는 역할을 한다. 애플에서 제공하는 각 클래스별 바인딩 가능한 키값들은 다음 문서 에서 확인하면 되고, 본 글에서는 자주 사용하는 바인딩 컨트롤러들의 상속구조를 살펴보고, 각각의 컨트롤러들에 어떤 키/경로 값을 설정할 수 있는지 정리해 보았다. 바인딩 컨트롤러 상속구조 NSController -> NSObjectController NSController -> NSObjectController -> NSArrayController NSController -> NSObjectController -> NSArrayController -> NSDictionaryController NSController -> NSObjectController -> NSTreeController NSController -> NSUserDefaultsController NSObjectController canAdd canRemove isEditable selectedObjects selection NSArrayController arrangedObjects canAdd canInsert canRemove canSelectNext canSelectPrevious filterPredicate isEditable selectedObjects selection selectionIndex selectionIndexes sortDescriptors NSDictionaryController arrangedObjects canAdd canInsert canRemove canSelectNext canSelectPrevious isEditable selectedObjects selection selectionIndex selectionIndexes sortDescriptors NSTreeController arrangedObjects canAdd canAddChild canInsert canInsertChild canRemove isEditable selectedObjects selectedNodes selection selectionIndexPath selectionIndexPaths sortDescriptors NSUserDefaultsController hasUnappliedChanges values

2014년 6월 14일 · 1분 · 121단어

MacOS 10.10 & iOS 8 새기능 익스텐션(Extensions) 개념 잡기

기존의 OS X나 iOS에서는 custom URL Scheme을 이용하거나 custom pasteboard(번들 seed ID를 동일한경우만 가능) 등을 이용하여 어플리케이션 간에 데이터를 **‘전달’**하는 것만 가능했다. 즉, A라는 앱에서 B라는 앱으로 데이터를 전달한 후 B앱으로 컨텍스트가 전환된 후 그 데이터를 받아서 추가적인 화면을 보여주거나 처리를 할 수는 있었지만, 아예 앱간 컨텍스트 전환 없이 A앱 내부에서 B앱이 가진 기능을 바로 사용하는 것이 불가능했다. 하지만 이번에 새로운 OS에 “익스텐션(Extensions)” 이라는 이름으로 이것을 가능하게 해주는 기술을 애플에서 공개했다. 앱간에 정보를 주고받으면서 앱 to 앱으로 전환이 일어나는 것 자체가 사용자에게 있어서는 불편이었기 때문에 이러한 익스텐션 기능이 잘 적용되면 사용자 경험 자체가 많이 좋아질 것으로 예상된다. (사용자에게 있어서는 앱전환이 일어나지 않는것으로 보이지만, 실제로 기술적인 관점에서 봤을때 익스텐션 자체는 실행중인 앱과는 다른 독립적인 프로세스인 것에 주의) ...

2014년 6월 14일 · 6분 · 1074단어

Aspect Oriented Programming in Objective-C

관점지향프로그래밍, Aspect Oriented Programming(AOP)이란? ‘Aspect’ 란 어떤 프로그램의 공통적인 기능(common feature)이 프로그램 전반에 걸쳐 영향을 주는 형태를 지칭한다. 예를들어 회원 정보를 관리하는 프로그램을 만드는 경우, 실제 회원 정보를 인덱싱하는 것이 핵심적인 문제(core concern)이며, 이 부분을 수정할때에는 해당 핵심 부분만 변경하면 되기때문에 영향받는 범위가 좁아서 모듈화(modularity)이 깨지지 않는다. 하지만 이 프로그램에 로깅(logging) 기능을 추가하게되면 어떻게될까? 로깅 기능은 DB, 인증, 등 시스템 전반에 걸쳐 적용이되어야하는 문제(cross-cutting concern)이며 따라서 로깅에 관한 코드들은 프로그램의 코드들 곳곳에 분포한다. 따라서 로깅기능을 추가하면서 기존의 객체지향프로그래밍(OOP)이나 절차지향프로그래밍(procedural programming) 방법론으로 개발할경우에는 모듈화가 깨지게 된다. 이러한 기존의 방법론의 한계점을 해결하기위해 특정 상황에서 제한적으로 AOP를 도입하는 것을 고려해볼만 하다. ...

2014년 5월 30일 · 2분 · 341단어

Xcode Debugging tips

엑스코드(Xcode)를 사용하면서 여러가지 유용하게 사용해왔던 기능들을 간단히 정리해보았다. 본 글에서는 잘 사용하지 않아서 모르고있지만 유용하게 사용될 수 있는 기능위주로 설명을 할 것이고 실제 디버거를 이용한 프로그램에대한 디버깅 방법은 다음 글에 더 자세히 적어두었으니 참조하도록 하자. http://www.letmecompile.com/xcode-lldb-디버깅-테크닉/ Xcode 디버깅 콘솔에 색상 적용하기 네트워크 어플리케이션을 개발하다보면 다양한 로그들이 여러 스레드에서 복합적으로 출력되어 한눈에 알아보기가 쉽지 않다. 이때 CocoaLumberjack과 XcodeColors 플러그인의 조합으로 콘솔화면에 로깅 타입에따라서 색상 적용이 가능해서 매우 편리하다. 다음 링크를 참고해서 설정하면 된다. ...

2014년 5월 20일 · 2분 · 390단어

Objective-C Tips from WWDC 2013

애플 WWDC2013, Session 228에 소개된 내용들 중 iOS나 Mac 개발시 자주쓰일만한 팁들을 추려내서 간단히 정리해보았다. 서브스크립팅(subscripting) 사용하기 Modern Objective-C 문법이 적용되면서 NSDictionary나 NSArray같은 foundation 데이터 구조객체들은 서브스크립팅을 이용하여 다음과같이 간결하게 작성이 가능하게되었다. [myArray objectAtIndex:3] -> myArray[3] [myDictionary objectForKey:@"key"] -> myDictionary[@"key"] 사용자가 만든 커스텀 클래스에도 서브스크립팅을 위한 set/get메서드만 잘 정의해두면 훨씬 더 간결한 프로그램 작성이 가능하다. MyCustomArray 클래스에 - (id)objectAtIndexedSubscript:(NSUInteger)idx; - (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx; 위 두가지 메서드 구현시 다음과같이 배열처럼 인덱스로 바로 접근 가능 ...

2014년 5월 19일 · 2분 · 345단어

NSView debug drawing

NSView debug drawing NSView의 레이아웃 계층(layout hierachy)이 어떻게 구성되어있는지 비주얼라이즈해서 보고싶은경우 NSShowAllViews Preference값을 YES로 셋팅해준 후 어플리케이션을 다시 실행하면 된다. 터미널의 커맨드라인에서 다음 명령을 실행하면 해당 번들ID를 가진 앱의 설정값을 변경 가능하다. defaults write com.your.apps.bundlename NSShowAllViews YES Constraint기반의 레이아웃이 어떻게 적용되고있는지는 NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints을 이용하여 볼 수 있다. defaults write com.your.apps.bundlename NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints YES 반대로 다시 끄고싶으면 값을 NO로 바꾸어 재실행한다. Preference 값을 지정하는 다른 방법 앞서 소개한것 처럼 커맨드라인에서 NSUserDefaults 키값을 강제로 바꿔줄 수도있지만, Xcode상에서 이 값을 scheme에 설정하여 실행할때마다 오버라이드하여 사용하는 방법 또한 편리하다. Xcode의 Edit Scheme 메뉴로 들어가서 ‘Arguments’ 탭의 Arguments Passed On Launch 항목에 아래 스크린샷처럼 -NSShowAllViews YES 라고 추가해 주면 해당 스킴에 의해 빌드되서 실행되는 어플리케이션의 경우 해당 값이 항상 설정되어 실행된다. ...

2014년 5월 10일 · 1분 · 114단어

NSButton으로 이미지버튼 만들기

맥OS의 코코아(cocoa)프레임웍에서 NSButton을 이미지버튼(image button)으로 사용할때 아래 속성을 제대로 설정하지 않으면, 클릭했을때 투명이미지 처리가 제대로 안되는 문제가 발생한다. [button setButtonType:NSMomentaryChangeButton]; iOS의 UIButton에서 커스텀 버튼을 만들고 이미지를 설정해서 사용하는 것처럼 동일하게 NSButton을 사용하려면 다음과같이 사용하면된다. NSButton* button = [[NSButton alloc] initWithFrame:NSMakeRect(0 , 0, 30,20)]; [button setImage:[NSImage imageNamed:@"bg.png"]]; [button setAlternateImage:[NSImage imageNamed:@"bg_highlighted.png"]]; // button의 frame과 image사이즈가 다를경우 scaling 설정 [button.cell setImageScaling:NSImageScaleAxesIndependently]; [button setBordered:NO]; [button setButtonType:NSMomentaryChangeButton]; [self.view addSubview:button]; strechable NSImage iOS에는 이미지 내부의 특정 영역만 늘려주는 UIImage내의 stretchableImageWithLeftCapWidth:(iOS5 미만) 나 resizableImageWithCapInsets:(iOS 5 이상) 메서드를 이용하여 나인패치(nine-patch) 버튼을 만들 수 있었다. 해당 메서드는 현재 Mac OS에 포함되어있지않은데, iOS와 비슷한 형태로 구현을 해놓은 라이브러리가 있어서 소개한다. ...

2014년 5월 8일 · 1분 · 127단어

NSSplitView 구현 팁

맥용 코코아(Cocoa) 어플리케이션을 만들다보면 NSSplitView가 많이 사용되는데 이와 관련된 몇가지 팁들을 소개해본다. NSSplitView 디바이더(divider) 숨기기 NSSplitView를 서브클래싱 한 후 다음 메서드를 오버라이드하여 디바이더의 두께를 0으로 만들어 숨길 수 있다. -(CGFloat)dividerThickness { return 0; } 디바이더를 숨겨도 리사이즈가 가능하게 만들기 위와같이 디바이더의 두께를 0으로 지정한경우, 디바이더의 영역이 없기때문에 스플릿뷰를 리사이즈하는 동작이 불가능하게된다. 이때 디바이더 대신 특정영역을 지정하여 해당 영역을 사용자가 마우스로 클릭을 할경우 리사이즈되도록 할수있다. 아래의 delegate를 구현한 후 divider index에 맞춰서 클릭가능 영역을 지정하여 리턴해주면 된다. ...

2014년 5월 8일 · 1분 · 192단어

싱크로나이즈드 스크롤 구현하기

여러개의 NSScrollView를 사용할때 스크롤뷰들 중에서 하나만 스크롤해도 여러개의 스크롤 뷰가 동시에 따라 움지이는 싱크로나이즈드 스크롤(Synchronized scroll)을 구현하기 위한 방법을 소개한다. 스크롤 이벤트 감지 NSScrollView의 스크롤이벤트를 받아오기 위해서는 NSScrollView가 가진 contentView의 바운드가 변하는 것을 모니터링 하면된다. 다음 코드로 스크롤뷰가 가진 contentView의 bound변화 notification을 활성화 한 후 [[scrollView contentView] setPostsBoundsChangedNotifications:YES]; 노티피케이션센터에 NSViewBoundsDidChangeNotification에대한 옵저버를 등록하여 이벤트를 받아온다. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contentDidScroll:) name:NSViewBoundsDidChangeNotification object:contentView]; NSScrollView를 특정 포인트로 스크롤 하기 앞에서 viewBound의 변화에대한 노티피케이션을 받았을때 변화된 bound를 불러와서 다른 스크롤뷰를 강제로 스크롤 시키면 된다. ...

2014년 5월 8일 · 1분 · 102단어