SwipeMenuDemo like as iOS Facebook App.

제목 그대로 Path와 Facebook에서 사용하고 있는 SwipeMenu를 만들어보았습니다. 구조는 아주 간단합니다. YBSwipeViewController가 Controller 역할을 하며, 이 인스턴스에는 Menu로 사용될 View Controller와 Content 영역에 사용될 View Controller가 정의되어 있습니다. Touch move될 때 Content View도 함께 움직이며 ended 되었을 때 Menu를 보여줄지 Content를 보여줄지 판단이 되어 애니메이션 블락으로 구현되었습니다. 다른 개발자분들이 만든 예제들도 있었지만 한 번 만들어보자는 생각에 만들어 본 녀석이라 참고만 하셔도 좋습니다. 구조는 데모 코드를 보면 쉽게 이해되시리라 믿습니다. 여기에서 배운 교훈은 1. 하나의 View Controller에 여러 view가 subview 되었을 때는 상단 StatusBar를 터치해도 scroll to top이 되질 않습니다. 따라서 YBSwipeViewController 코드에서 볼 수 있듯이 메뉴 view는 나타나기 전에는 addSubview, 사라졌을 때는 removeFromSuperview가 수행되어야 합니다. iOS5만 지원할 경우에는 childViewController로 쉽게 해결 할 수 있는데 iOS4 지원을 위해서는 삽질(?)을 해야했습니다. 2. Swipe를 위한 GestureRecognizer는 쉽게 생각해서 UISwipeGestureRecognizer를 이용한다고 할 수 있으나, touch move가 되어야 한다면 UIPanGestureRecognizer를 이용하여야 합니다. 즉, Swipe의 요구사항에 따라 적절히 사용해야 합니다. 3. iPhone에서는 메뉴가 나타났을 때 오른쪽으로 걸쳐있는(?) content…

Layer를 이용해 View에 그림자(shadow) 입히기

Layer는 정말 봐도봐도 멋진 녀석인 것 같습니다. 더욱이 Layer는 CPU가 아닌 GPU를 사용하니 프로세서에 큰 부담도 없구요. 요즘 이래저래 Layer 만지는 재미에 빠져있는데요. 간단한 팁입니다. Layer를 이용해서 View에 그림자(Shadow)를 넣는 방법입니다. UIView *testView = [[UIView alloc] initWithFrame:CGRectMake(20.0f, 50.0f, 280.0f, 100.0f)]; UIBezierPath *shadowPath = [UIBezierPath bezierPathWithRect:testView.bounds]; testView.backgroundColor = [UIColor yellowColor]; [testView.layer setMasksToBounds:NO]; [testView.layer setShadowColor:[[UIColor blackColor] CGColor]]; [testView.layer setShadowOffset:CGSizeMake(0.0f, 0.0f)]; [testView.layer setShadowOpacity:1.0f]; [testView.layer setShadowRadius:3.5f]; [testView.layer setShadowPath:shadowPath.CGPath]; [self.view addSubview:testView]; [testView release]; 그림자 범위를 조절할 때는 Radius 값을 조절하시면 되며, 그림자 위치를 조절할 때는 Offset 값을 조절하시면 됩니다.   오늘은 간단히 끝. =3=33

iTunes File Sharing 지원할 경우 Document 디렉토리 사용에 관하여

현 시점의 iOS 공개버전 5.0.1 시점에서 앱 스토어에 앱을 등록 시 sandbox 내의 Document 사용이 엄격히 통제되고 있다. 이유는 iOS5에서 공개된 iCloud 때문이며, iCloud 트래픽을 줄이기 위한 제한사항으로 보여진다. 애플의 권고사항을 간략히 살펴보자면, Document는 사용자에 의해 생성된 데이터야 하며, 다시 다운로드가 가능하거나 캐싱(Caching)용도로 사용할 수 없다. 캐싱용도로 사용을 위해서는 Temp 디렉토리나 Cache 디렉토리 이용을 사용하라는 다소 엄격한 권고사항이다. 위 권고를 어기고 앱 등록 시에는 어김없이 Reject이라는 결과를 얻게되고 Resolution Center에서는 이에 대해 수정하라고 명시된다. 개인적으로는 이 권고는 사용자의 네트워크 비용이나 iCloud 자체의 유지보수 차원에서는 찬성이지만 iTunes File Sharing 과 같은 기능을 지원 시에는 사용자 데이터로 봐야할지 다시 다운로드가 가능한 데이터로 봐야할지 애매하다. 그래서인지 iOS5가 공개되고 얼마되지 않아 iOS5.0.1이 공개되었으며 업데이트 내용 중에는 File Attribute가 추가되었다. 이 역시 간략히 설명하자면, Document 디렉토리에 데이터를 저장하는 것은 가능하지만 File Attribute를 이용해 iCloud와 동기화하지 않도록 속성을 부여해라. 라는 것이다. 그렇다면 다시 iTunes File Sharing 지원을 살펴보자. 자주 사용하는 분들은 아시겠지만 iTunes File Sharing의 경우…

UINavigationController에 UIGestureRecognizer 등록하기

사내에서 Path 2 리뷰를 했습니다. 리뷰 포스트는 여기를 누르시면 보실 수 있습니다. 포스트에 등록된 댓글에 UINavigationController에 UIGestureRecognizer 등록한 부분에 대한 상세한 설명 부탁하신 분에게 도움이 되었으면 합니다. 사실 퀵리뷰를 위한 Demo여서 견고하게 구현하지 않았고 설명에서 제외했었습니다. 참고하셔서 더 멋진 앱 만들어주세요. 🙂   1.UINavigationController를 상속받는 클래스를 생성합니다. UINavigationController의 구조에 대한 Documentation을 보면 알겠지만 UINavigationController는 UINavigationController에 설정되는 rootViewController보다 상위. 즉, 부모 클래스입니다. 따라서 터치 등의 이벤트를 받는 UIResponder는 UINavigationController의 view를 먼저 거치게 됩니다. 2. 생성된 클래스의 – (void)loadView; 또는 -(void)viewDidLoad; 메소드에 UISwipeGestureRecognizer를 정의합니다. 물론 – (void)touchesBegin: 등의 터치 이벤트 관련 메소드로 정의를 하셔도 됩니다만 손이 많이 갈 수 있어서 좌/우 각각에 대한 UISwipeGestureRecognizer를 이용하였습니다. – (void)loadView { [super loadView]; UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onList)]; leftSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft; [self.view addGestureRecognizer:leftSwipeGestureRecognizer]; [leftSwipeGestureRecognizer release]; UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(onMenu)]; rightSwipeGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight; [self.view addGestureRecognizer:rightSwipeGestureRecognizer]; [rightSwipeGestureRecognizer release]; }   3. 좌/우 Gesture에 따라 UINavigationController의 view의 frame 값을 애니메이션을 적용하여 변경합니다. 사실상…

키보드가 나타나거나 사라질 때 View 크기 조절 방법

회원가입 등 UITableViewCell에 subView로 UITextField, UITextView 등이 존재하고, 이를 터치했을 경우 키보드가 나타날 때 입력해야 할 공간이 키보드에 덮혀버리는 문제가 생기는데요. 이 때 위 문제를 해결하기 위해 여러 방법을 생각할 수 있을 것입니다. UITableView를 안쓰면 되잖어! 라고 생각하시는 분도 계실테고 다른 꼼수를 이용하여 구현하시는 분도 계실 것입니다. 제가 구현한 방법은 아래와 같습니다. 1. ViewController의 기본 메소드 중 viewWill(Did)Appear, viewWill(Did)Disappear에서 Keyboard Notification의 Observer를 생성/삭제 합니다. name은 UIKeyboardWill(Did)ShowNotification, UIKeyboardWill(Did)HideNotification 으로 정의된 키보드 Notification을 View가 그려지기 전에 Observer에 등록하고, View가 사라지기 전에 삭제하였습니다. – (void)viewWillAppear:(BOOL)animated   { [super viewWillAppear:animated]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appearKeyboard:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(disappearKeyboard:) name:UIKeyboardDidHideNotification object:nil]; } – (void)viewWillDisappear:(BOOL)animated    { [super viewWillDisappear:animated]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidHideNotification object:nil]; } 2. 키보드 이벤트의 selector를 아래와 같이 정의합니다. 여기서 중요한 부분은 NSNotification에 정의된 userInfo 입니다. 키보드가 나타나는 이벤트의 duration, curve를 비롯하여 frame 정보가 이 userInfo에 정의되어 있습니다. 따라서 이 userInfo 값을 참조하여 키보드가 나타나거나 사라질…