본문 바로가기

프로그래밍/iOS243

TableView에서 긴글을 표시할때 Row 높이를 다이나믹하게 조정하기 TableView를 이용해서 SNS를 개발 하기위해 선두지점에 있는 Facebook 앱을 보았다. 이렇게 Label이 길수록 TableView cell row가 길게 나왔다. 이렇게 할려면 글을 길이를 계산해서 row의 높이를 계산해야 한다. #define FONT_SIZE 14.0f #define CELL_CONTENT_WIDTH 320.0f #define CELL_CONTENT_MARGIN 10.0f 일단 사이즈를 계산하기 위해 고정적인 정보를 정의 했다. - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; { NSString *text = [items objectAtIndex:[i.. 2012. 4. 26.
Custom segmented controls 주제 : 세그먼트 컨트롤을 커스텀 한다. Cocoa 터치 프레임워크에는 다음 4가지 타입의 세그먼트 컨트롤이 존재한다. 색상 및 디자인은 변경이 불가능하다. Apple 문서를 보면 세그먼트 컨트롤의 경우 단순한 버튼 그룹이라고 소개하고 있다. 때문에 버튼을 이용해서 세그먼트 컨트롤을 만들 수 있다. 커스텀 세그먼트 컨트롤 헤더 파일 먼저 정의된 헤더 파일을 살펴 보자. CustomSegmentedControlDelegate라는 delegate를 선언하고 buttonFor:atIndex:메서드를 선언한다. 이는 델리게이터가 실제 이미지를 드로잉하는 부분을 위임하게 된다. optional 델리게이터 메서드는 이벤트에 대한 액션(버튼 클릭시) 처리를 해준다. buttons는 세그먼트 컨트롤의 구성요소인 버튼을.. 2012. 4. 25.
Cropping Images using Graphic Contexts 주제 : Core Graphics API 사용해 이미지를 자르고 늘리는 작업을 한다. 이미지 늘리기 다음은 1px을 가지는 이미지를 UIImage 클래스가 지원하는 stretchableImageWithLeftCapWidht:topCapHeight: 메서드를 이용해 이미지 뷰를 만드는 방법이다. 이와 같은 방법으로 패턴 이미지도 생성이 가능하고 간단하게 이미지를 변형이 가능하다. UIImage *image = [[UIImage imageNamed:@"1px-blue-divider.png"] stretchableImageWithLeftCapWidth:0.0 topCapHeight:0.0]; UIImageView *imageView = [[[UIImageView alloc] initWithImage:image.. 2012. 4. 25.
한 번에 루트 뷰 컨트롤러 표시하기 UINavigationController 사용 시, 스택에 여러 뷰 컨트롤러가 쌓여 있어도 다음 메시지를 통해 한 번에 RootViewController를 표시할 수 있다. 1[self.navigationController popToRootViewControllerAnimated:YES]; 처음부터 알았었다면 아래와 같은 삽질은 하지 않았을 텐데. 12345// 삽질입니다. for (int i = 0; i < [self.navigationController.viewControllers count]; i++){ [self.navigationController popViewControllerAnimated:NO];} 출처 : http://sunsideup.tistory.com/category/%EA%B0%9.. 2012. 4. 25.
Push Notification 적용하기 #2. 앱 수정 Registering for Remote Notifications 애플리케이션이 프로바이더로 부터 Remote Notifications(푸시 알림)을 받기 위해서는 다음 그림과 같은 일련의 등록 과정을 거쳐야 한다. 등록 과정은은 3단계로 나눠지며, 실제로 서비스 될 앱을 개발할 경우 등록 후 발급받은 디바이스 토큰을 프로바이더로 전달해주는 과정이 추가로 필요하다. 여기서는 애플리케이션이 푸시 알림을 사용할 수 있는 '최소한의' 과정만을 설명한다. 실제 프로젝트에서는 더욱 많은 소스 코드가 필요하다. Local and Push Notifications Programming Guide, Apple * 알림을 발생하는 서비스를 프로바이더(Provider)라 한다. registerForRemoteNotific.. 2012. 4. 25.
Push Notification 적용하기 #1. SSL 인증서 생성 APNS (Apple Push Notification Service) iOS 기반의 서버/클라이언트(앱) 서비스 개발시, 서버에서 발생한는 다양한 이벤트나 데이터를 클라이언트에 전달하기 위해서는 APNS를 사용해야만 한다. iOS는 백그라운드 프로세스를 '제한적으로만' 제공하기 때문에 안드로이드처럼 폴링 방식을 사용할 수 없기 때문이다. 폴링 방식은 백그라운드 프로세스를 통해 서버와의 연결을 지속적으로 유지해야 하며, 짧은 주기로 서버와 통신을 해야 한다. 적은 메모리와, 더럽게 적은 배터리같이 한정된 자원을 가진 스마트폰이나 스마트패드에서 사용하기에는 껄끄로운 방법이다. 대신, 애플은 APNS라는 아주 세련된 방법을 통해 아이폰에게 데이터를 '던져' 줄 수 있는 방법을 제공한다. 배터리 걱정도 없고 보.. 2012. 4. 25.
ZBar 라이브러리를 이용한 바코드 스캔 앱 개발하기 ZXing 라이브러리로 테스트삼아 개발한 앱이 1D 바코드 스캔 시 에러를 계속 뱉어 낸다. 이유를 알 수 없어 ZXing 구글코드 위키를 살펴보니, iOS용 ZXing 라이브러리는 1D 바코드를 읽을 수 없다고 한다. 생각보다 빨리 끝났다 생각해서 몇 일 칼퇴근했구만..아놔.. 마음 같아서는 RedLaser SDK라도 사서 쓰자고 하고 싶었지만 가격보고 포기했다. XZing을 제외한 쓸만한 iOS용 바코드 스캔 라이브러리는 죄다 유료인 와중에, 개발자들의 성지 스택오버플로우의 양덕 개발자 댓글을 통해 ZBar라는 바코드 스캔 라이브러리를 찾았다. XZing과 비교해 사용법도 간단하고 기능도 쓸만한다. (실제 앱 스토어에 올라가 있는 앱의 소스코드까지 제공을 하니 스터디 용도로 사용해도 좋을 듯 하다) .. 2012. 4. 25.
ZXing 라이브러리를 이용한 QR코드 리더 앱 개발하기 #2. 앱 구현하기 이전 포스팅에서 이어집니다. 2011/09/05 - [공부/iOS] - ZXing 라이브러리를 이용한 QR코드 리더 앱 개발하기 #1. ZXing 라이브러리 추가 루트 뷰 컨트롤러 추가 닙(Xib) 파일을 포함하는 새 뷰 컨트롤러를 프로젝트에 추가한다. 이름은 RootViewController로 한다. 추가 후 ZXingTestAppDelegate.m 파일과 RootViewController.m 파일의 확장자를 'mm' 으로 변경한다. * 프로퍼티 선언, 릴리즈 코드는 생략. RootViewController.xib QR코드 스캔 결과를 표시할 읽기 전용의 UITextField 컨트롤과 UIButton 컨트롤을 추가한다. RootViewController.h ZXingDelegate 프로토콜을 추가하고 .. 2012. 4. 25.
ZXing 라이브러리를 이용한 QR코드 리더 앱 개발하기 #1. ZXing 라이브러리 추가 ZXing (Zebra Crossing) 라이브러리는 자바로 개발된 바코드 프로세싱 오픈소스 라이브러리다. 자바로 개발되었지만 다양한 플랫폼을 위한 모듈들을 제공한다. 여기서는 ZXing 라이브러리를 이용하여 iOS 기반의 QR코드 리더 앱을 개발하는 과정을 간단하게 설명한다. 프로젝트 생성 1. Window-based Application 프로젝트를 선택하여 'ZXingTest' 프로젝트를 생성한다. ZXingWidget 라이브러리 추가 1. 다운로드 받은 ZXing 라이브러리의 압축을 해제하고 zxing 폴더를 ZXingTest 프로젝트 폴더에 복사한다. 실제로 필요한 폴더는 zxing/cpp 폴더와 zxing/iPhone 폴더다. 두 폴더의 절대 경로만 정확하게 알고 있다면 위치는 크게 상관없다. .. 2012. 4. 25.
zbar & beep sounds for QR code zbar 라는 오픈 소스입니다.. http://itunes.apple.com/ca/app/zbar-barcode-reader/id344957305?mt=8 로 어플로 나와있기도 한데... 예제도 잘돌아가고 인식율도 좋습니다. 일반 바코드, QR코드 다 인식됩니다. objective-c뿐만아니라.. 여러 언어에 대한 샘플도 있네요 hmall search 어플도 이걸 이용했다고 나오고.. http://zbar.sourceforge.net/ 샘플및 적용방법: http://sourceforge.net/apps/mediawiki/zbar/index.php?title=HOWTO:_Add_a_barcode_reader_to_an_iPhone_app 파일 첨부하였습니다 출처에대한 description 넣어주고 붙여도 .. 2012. 4. 25.
Skinning a UIProgressView with drawRect and images Here is an easy way that I’ve come up with to skin the default UIProgressView in an iOS application using just 2 images, and implementing the drawRect: method. This is what the default progress view looks like: …and here is our custom skinned version. To achieve this you will need 2 images: one for the background, and one for the fill. The images that I’ve shown here were designed by Darran Morr.. 2012. 4. 25.
iOS 앱 개발시 AES 256으로 데이터 암호화하여 저장하기와 복호화하여 읽어오기 출처 : http://blog.saltfactory.net/118 iOS 는 보안상 자신의 앱에서 접근할 수 있는 Sandbox를 제외하고 접근하면 앱 리뷰에서 reject를 당한다. 보안상 앱이 접근할 수 있는 Diectory는 제한이 되어 있다. 아래 그림은 아이폰 앱에서 접근할 수 있는 Sandbox를 그림으로 표현한 것이다. Documents는 iCloud가 서비스가 오픈되고 나서 부터는 백업이 가능한 디렉토리로 임시 파일을 저장하면 reject의 사유가 된다. Library 안의 Caches 디렉토리에 파일을 저장하면 iCoud 자동 백업 목록에서 제외하여 저장할 수 있도록 되었다. < 이미지 출처 : http://developer.apple.com/library/mac/#documentatio.. 2012. 4. 24.
iCloud관련 리젝 사례 이번엔 두가지 이유로 거절당했다. In App Purchases 에서 null 값으로 표시되는 것과 iOS 5.0 iCloud을 위한 데이터 저장 정책을 따르지 않은 이유다. 첫번째 문제는 App Rejected 가 되면 In App Purchases 의 Review도 같이 Rejected 되는데 이 경우 서버로부터 값을 제대로 받아오지 못한다. 코드상 문제는 없었고 단지 IAP의 Status을 Rejected에서 Waiting for review로만 바꾸기만 해서 해결했다. 두번째 문제는 iOS iCloud 데이터 저장 정책인데 이전과 달리 꽤나 엄격하게 심사를 한다. 심지어 다운로드받은 파일이 얼마나 Document 에 저장되는지도 체크해서 용량까지 알려준다. 4.5MB도 허용 안해~! In part.. 2012. 4. 24.
iCloude관련 리젝시 이미 관련글이 올라와 있는지는 모르겠지만... 아이클라우드 약관이 생기면서,.,. 도큐멘트 폴더에 저장을 하게 되면 리젝을 먹는 경우가 있습니다. 애플에서는 도큐멘트 폴더를 아이클라우드가 가져가지 못하게 하는 코드를 알려주더군요. 이 코드는 iOS5.0.1버전 부터 지원합니다. 이렇게 사용해 보고 아이클라우드로 다시 백업을 해보니~ 가져가지 않았더군요..... 5.0버전 이하는 아이클라우드가 없으니까 처리를 안해줘도 되고...5.0.1버전부터 지원하는 거라....5.0은 어떻게 하나 걱정을 했는데... 일단 5.0.1이상만 처리해서 올렸는데 통과는 되더군요... 간단한 팁이었습니다.... //iCloud 막을 Document경로 설정 NSString *documentPath = [NSSearchPathF.. 2012. 4. 24.
언어코드와 지역코드 아이폰 앱을 개발한다면, 국제화와 지역화는 당연한 선택이 될 것이다. 다음 두 링크에서 언어코드와 지역코드 목록을 확인할 수 있다. ko_KR 언어코드_지역코드 언어코드: Codes for the Representation of Names of Languages Alpha-3 codes arranged alphabetically by the English name of language 지역코드: ISO 3166-1 English Name of Language All English Names All French Names ISO 639-2 ISO 639-1 Abkhazian Abkhazian abkhaze abkab Achinese Achinese aceh ace Acoli Acoli acoli ach A.. 2012. 4. 23.
파일 이어받기 // bytes=?-Range로 이어받기 기능.// NSURLConnection로 파일 다운로드NSString *range = [NSString stringWithFormat:@"bytes=%d-", [_receivedData length]];NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:fileURL]];[request setValue:range forHTTPHeaderField:@"Range"];_urlConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 로 하시면 됩니다._receivedData 는 NSU.. 2012. 4. 18.
XCode 4.2에서 Distribution 하기 1. Product->Edit Scheme -> Archive : 오른쪽 창에서 Build Configuration 하기2. Code Sign -> Release3. Product-> Archive4. Organize->Archives에 생성된 버젼 Submit 하기 2012. 4. 17.
Xcode4에서 범용으로 쓸 수 있는 library만들기. 개발하다보면 Common Module 혹은 Common Library 등.. 이런 뉘앙스의 이름으로 불리는 녀석들이 있다. 개발하는데 공통적으로 쓰이는 것들을 모아놓은 녀석들을 지칭하는 말인데, cocoa에서는 이렇게 안부르고 static library라고 부른다. iPhone, iPad의 경우 시뮬레이터가 있다보니 시뮬레이터(simulator)용, 디바이스(device)용 이렇개 2가지를 만들어서 상황에 맞게 사용을 해야 하는데, 이게 참 번거로운 일이다. 생각해보라. 시뮬레이터로 테스트 할땐 시뮬레이터용 라이브러리를 넣고 디바이스에서 테스트 할땐 시뮬레이터용 라이브러리를 삭제하고, 디바이스용 라이브러리를 넣고 다시 시뮬레이터로 테스트 할땐 디바이스용 라이브러리를 지우고, 시뮬레이터용 라이브러리 넣고... 2012. 3. 29.
iPhone용 Open Source 모음 http://www.cocoacontrols.com/platforms/ios/controls/mnmbottompulltorefresh https://github.com/enormego/EGOTableViewPullRefresh http://michael.stapelberg.de/cCSVParse http://www.cocoacontrols.com/platforms/ios/controls/balabel http://www.cocoacontrols.com/platforms/ios/controls/fxlabel http://www.cocoacontrols.com/platforms/ios/controls/coolbuttons http://www.coco.. 2012. 3. 22.
iOS Flip Transform 출처 : http://www.binpress.com/app/ios-flip-transform/687 Animation component for the effect of flipping as in a news/clock ticker, or a page turn. Structured around the idea of a data object (i.e. headline in news, number in a clock, page in a book) as an animation frame, comprised of multiple CALayers. Supports 3 interaction modes: Triggered: as in a tap to flip Auto: as in a revolving flip that.. 2012. 3. 6.
Creating an iPad flip-clock with Core Animation 출처: http://www.voyce.com/index.php/2010/04/10/creating-an-ipad-flip-clock-with-core-animation/ As part of the sliding puzzle game I’m developing for the iPhone and iPad (well, I can’t survive on the profits from BattleFingers forever), I looked for a way to represent a numeric score and time display in an interesting way. One of the nicer visual effects you could use for this is the “flip-card c.. 2012. 3. 6.
iPhone 에서 OAuth 라이브러리 사용하기 지난 주에 아이폰에 OAuth 컨슈머 라이브러리 돌리는데 삽질을 너무 많이 해서 반성하는 의미로 포스팅 해본다.http://oauth.net에 있는 라이브러리는 아이폰에 바로 쓸 수 없어서 약간 손을 봐야하는데 누군가 이미 해놓은 것도 있지만 기본(?) 라이브러리로 한번 해봤다. 붙이는건 그렇게 어렵지 않은데 아이폰에 써드파티 바이너리 프레임웍 추가 안되는거랑 Security.framework 내용이 Mac의 것과 다르다는 걸 몰라서 시간을 엄청 허비했음. OAuthTest.zip OAuthConsumer 라이브러리를 체크아웃 한다. svn checkout http://oauth.googlecode.com/svn/code/obj-c/ . 프레임웍으로 빌드해서 넣으면 깔끔하겠지만 아이폰에는 그렇게 넣을 수.. 2012. 2. 29.
OAuthConsumer를 이용한 xAuth 출처: http://dreamofblue.tistory.com/tag/OAConsumer OAuthConsumer 는 Objective-C로 구현된 OAuth 라이브러리이다. 이 라이브러리는 OAuth에 필요한 여러 모듈들을 포함하고 있으며 이를 이용하여 xAuth 인증도 가능하다. 인증 방법은 아래와 같다. 1. OAConsumer 에 부여받은 Consumer Key와 Secret를 입력한다. Twitter에서 Consumer Key와 Secret을 받기 위해서는 "http://dev.twitter.com/apps/new"에 접속하여 등록하고, Foursquare에서 받기 위해서는 "http://foursquare.com/oauth/"에 접속해서 등록한다. OAConsumer *consumer = [O.. 2012. 2. 29.
localize 출처 : http://stackoverflow.com/questions/1669645/how-to-force-nslocalizedstring-to-use-a-specific-language I have found another solution that allows you to update the language strings, w/o restarting the app and compatible with genstrings: Put this macro in the Prefix.pch: #define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] .. 2012. 2. 17.