인터넷에 있는 기존 코드를 iPhone으로 변경해서 만들어 봤는데.. 구글 맵 등으로 테스트 해보니 잘 동작합니다.

-(double)distanceLat1:(double)aLat1 long1:(double)aLong1 lat2:(double)aLat2 long2:(double)aLong2 {
double R = 6371;
double dLat = (aLat2 – aLat1)*M_PI/180.0;
double dLon = (aLong2 – aLong1)*M_PI/180.0;

double a = sin(dLat/2) * sin(dLat/2) + cos(aLat1*M_PI/180.0) * cos(aLat2*M_PI/180.0) * sin(dLon/2) * sin(dLon/2);
double c = 2 * atan2(sqrt(a), sqrt(1-a));
return R * c;
}

-(double)angleLat1:(double)aLat1 long1:(double)aLong1 lat2:(double)aLat2 long2:(double)aLong2 {
return atan2( aLat2-aLat1 , aLong2 – aLong1)* 180.0 / M_PI;
}

Ref: http://www.movable-type.co.uk/scripts/latlong.html

Ref: http://cafe.naver.com/hhjae84.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=122

'iOS' 카테고리의 다른 글

노티피케이션(NSNotification)을 써보자!  (0) 2011.02.23
NSDate 지정  (0) 2011.02.23
문자열로 NSDate 만들기 및 날짜 차이 구하기  (0) 2011.02.17
어제구하기  (0) 2011.02.17
탭바 커스텀  (0) 2011.02.13
Posted by 소울입니다
,

*주의: Push Notification service에 관한 내용이 아닙니다



http://cafe.naver.com/mcbugi/21370  에 올린 델리게이트에 관한 내용에 이어서 이번에는 노티피케이션에 관한 내용을


적어 봅니다.. 이전과 마찬가지로 가장 심플한 수준의 코드로 샘플코드를 만들 것이니 복잡한 활용법은 스스로 문서등을 참조해서


깨우치도록(?) 하세요..


델리게이트와 마찬가지로 NSNotification도 오브젝트간의 통신을 위한 많은 방법들 중에 하나입니다. Delegate보다 사용법은 


심플하고 강력하지만 잘못쓰면 코드가 엉망이 될 위험부담도 큰 놈입니다. 개념은 매우 단순합니다. 노티피케이션 센터란놈에


특정 메세지를 등록해두고 이 메세지가 불리어지면 다른 여러 오브젝트에 등록된 옵져버들이 메세지에 반응해서 이벤트를 


처리해주는 식입니다. 노티피케이션의 강력한점은 동시에 여러오브젝트에 메세지를 전달한다는 점입니다. 



자 그럼 샘플코드를 만들어 보도록 합시다.  


텝바 베이스로 4개의 뷰컨트롤러를 가진 프로그램입니다. 각각의 뷰컨트롤러간에는 아무런 연관 관계도 없고 1번 뷰컨트롤러에서


메세지를 보내면 2,3,4번 뷰컨트롤러가 노티피케이션 옵져버에 의해서 메소드를 불러와서 값이 갱신되도록 하겠습니다.



먼저 4개의 뷰컨트롤러를 가진 프로그램을 만들었습니다. 이동은 탭바로 하지만 아무것도 없으니 너무 허전하내요..






일단 1번 뷰컨트롤러에는 텍스트 필드를 만들고 2,3,4번에는 1번 뷰컨트롤러의 텍스트 필드에 입력한 텍스트 값이 2,3,4번에


노티피케이션에 의해서 동시에 갱신되도록 만들겠습니다.






먼저 1번 뷰 컨트롤러 입니다.


init함수에 텍스트 필드 하나를 위치시켰습니다.



FirstViewControllert.m

-(id) init{

self = [super init];

if (self != nil) {

textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 10, 300, 25)];

textField.delegate = self;

textField.borderStyle = UITextBorderStyleRoundedRect;

[self.view addSubview:textField];

}

return self;

}


그리고 텍스트필드에서 완료를 누르면 키보드가 사라지면서 값을 저장하기 위해서 델리게이트 함수를 구현했습니다.


-(BOOL) textFieldShouldReturn:(UITextField *)_textField{

//키보드 내리기

[_textField resignFirstResponder];

//파라메터로 넘길 텍스트 필드의 스트링을 딕셔너리에 넣습니다

NSDictionary *dic = [NSDictionary dictionaryWithObject:_textField.text forKey:@"inputText"];

//노티피케이션 센터에 라벨을 갱신하라고 메세지를 보냅니다. 파라메터는 NSTimer처럼 userInfo 이용해서 텍스트필드의 내용을 파라메터로 보내줬습니다. 보통 NSDictionary타입으로 보내줍니다

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

[nc postNotificationName:@"saveTextFieldText" object:self userInfo:dic];

return YES;

}



키보드의 완료 버튼을 누르면 키보드가 내려가면서 입력받은 텍스트를 노티피케이션 센터에 saveTextFieldText 

메시지와 함께 전송을 합니다. 

**메세지는 노티센터에서 공통으로 쓰기때문에 될수있으면 구체적이고 알기 쉽게.. 나중에 노티피케이션 메세지가 많아지면 관리가 엉말이 될수 있습니다.


이제 노티피케이션 센터에서 보낸 메세지에 반응하도록 다른 뷰컨트롤러들을 수정해 줍시다.



SecondViewController.m


-(id) init{

self = [super init];

if (self != nil) {

notificationLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 25)];

notificationLabel.backgroundColor = [UIColor blueColor];

[self.view addSubview:notificationLabel];

NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];

[nc addObserver:self selector:@selector(saveText:) name:@"saveTextFieldText" object:nil];

}

return self;

}


addObserver소드로 노티피케이션 센터에서 해당 메시지(saveTextFieldText)가 넘어오면 saveText: 메소드가 핸들링되게 설정을 해놨습니다.

다른 뷰컨트롤러도 동일하게 등록해주면 됩니다.


-(void)saveText:(NSNotification *)note{

NSString *text = [[note userInfo] objectForKey:@"inputText"];

notificationLabel.text = text;

}


실제 노티피케이션으로 메시지가 넘어왔을때 핸들링 하는 함수입니다. note의 userInfo는 이전에 userInfo로 넘긴 정보가 그대로 들어있으니


파라메터로 받아와서 라벨의 텍스트를 갱신 시켰습니다.



실제로 잘 작동하는 가볼까요?




노티피케이션 메세지가 잘넘어가는군요~ 잘만 활용하면 강력한 노티피케이션을 간단하게 이용해봤습니다. 그밖에 응용은 적당히


잘하시기 바랍니다, 그럼 이만 물러갑니다.

Posted by 소울입니다
,

NSDate 지정

iOS 2011. 2. 23. 00:15
Posted by 소울입니다
,
현재 개발하고 있는 어플때문에 만든 루틴인데 만들고 나니 필요가 없어져버린 루틴입니다. 간단히 문자열을 통해 NSDate를 생성한다음 2개의 DSDate 차이를 구하는 루틴입니다. 나중에라도 필요해질거 같아 이곳에 기록합니다.

// 포맷터를 만듭니다.
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];

// 문자열로 부터 NSDate를 구하는 부분입니다.
// 문자열은 포맷터의 형식에 맞게 만들어 제공해야 합니다.
NSDate *oldDateTime = [dateFormatter dateFromString:@"2010-06-20 23:50:01"];
NSDate *newDateTime = [dateFormatter dateFromString:@"2010-06-20 22:49:54"];

// 두 날짜의 차이를 초단위로 리턴해줍니다.
double ti = [oldDateTime timeIntervalSinceDate:newDateTime];

// 메모리를 제거합니다.
[dateFormatter release];

'iOS' 카테고리의 다른 글

노티피케이션(NSNotification)을 써보자!  (0) 2011.02.23
NSDate 지정  (0) 2011.02.23
어제구하기  (0) 2011.02.17
탭바 커스텀  (0) 2011.02.13
[iOS] Stretchable Image를 이용해 App. Size를 줄여보자.  (0) 2011.02.12
Posted by 소울입니다
,

어제구하기

iOS 2011. 2. 17. 01:51
    NSTimeInterval timediff = -24 * 60 * 60;  // 하루에 24시간 * 60분 * 60초. 어제니까 마이너스 (-)

    NSDate *yesterday = [NSDate dateWithTimeIntervalSinceNow:timediff];
Posted by 소울입니다
,

탭바 커스텀

iOS 2011. 2. 13. 03:41

요즘 잘나가는 앱들을 살펴보면  이쁜 배경에 이쁜 버튼 ..
정말 우리 나라 사람들은 디자인을 참 중요히 여기는 것 같습니다.

저만 해도 같은 기능이라도 기본 베이직 스킨보다는 이쁜 배경을 가진 앱을 더 선호하게 되더라고요.

그래서 오늘은
Tab Bar 를 커스텀 구현하는 내용을 포스팅 하도록 하겠습니다.
제가 지금 부터 하는 커스텀은 약간의 뺑기(?) 라고 할수 있어요. 눈 속임이랄까, 정말 탭바 버튼 하나하나에 커스텀을 하는게 아니고 배경 자체를 덮어서  오른쪽 클릭하면 배경 탭바이미지1를 보여주게하고  왼쪽 클릭하면 2 배경탭바 이미지를 보여주게하는 내용입니다.

탭바 전체를 덮어야하기 때문에 아래 와 같은 이미지 2개가 필요합니다. (버튼이 늘어날수록 물론 이미지는 더 필요하겠죠?


사용자 삽입 이미지

별로 어렵지 않습니다. 후다닥 만들어 보겠습니다.
프로젝트 새로 선택하셔서  Tab Bar Application 선택해서 적당한 프로젝트 명으로  만들어주세요. 저는 TabBar 라고 만들었어요.
그리고 탭바 배경이미지가 될 2개의 이미지를 리소스 폴더에 넣어주시고요.  ( 이미지는 소스파일 참고하세요 )

사용자 삽입 이미지


그리고 소스에 아래와 같이 프로그래밍 해주세요 . 설명 참고하시면 이해 가실거예요.

TabBarAppDelegate.h

#import <UIKit/UIKit.h>

@interface TabBarAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
    UIView *tabBarBg;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UIView *tabBarBg;

@end


TabBarAppDelegate.m


#import "TabBarAppDelegate.h"

@interface UITabBarController (private)   
- (UITabBar *)tabBar;

@end


@implementation TabBarAppDelegate

@synthesize window;
@synthesize tabBarController;
@synthesize tabBarBg;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
   
 CGRect frame = CGRectMake(0, 0, 480, 49);  //탭바 아래쪽 위치 좌표

 tabBarBg = [[UIView  alloc] initWithFrame:frame]; 
 UIImage *tabBarBackgroundImage = [UIImage imageNamed:@"MENU1.png"];   //이미지를 변수에 저장

 UIColor *color = [[UIColor alloc] initWithPatternImage:tabBarBackgroundImage];  //변수에 저장된 이미지를 UIColor 형 타입으로 저장
 
 [tabBarBg setBackgroundColor:color];   //위에서 선언인 UIView 에다 이미지를 올리기
 [color release];
 [[tabBarController tabBar ] insertSubview:tabBarBg atIndex:0];   //탭바 atIndex 0번째에  위에 이미지 올린 UIView 집어넣음

     // Add the tab bar controller's current view as a subview of the window
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];

 return YES;
}

// 탭바 선택할 때 호출되는 곳  (이 이벤트를 쓰기 위해서는 탭바를 delegate 로 지정해야해요 이건 아래쪽에 그림과 함께 설명해드릴게요)
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
 
 NSInteger tabIndex = tabBarController.selectedIndex;  //현재선택된 탭바 index를  인트형 변수에 할당
 

 if (tabIndex == 0) {   //0번째 탭이 선택되면  이미지 를 MENU1.png로 변경

  UIImage *tabBarBackgroundImage = [UIImage imageNamed:@"MENU1.png"];
 
  UIColor *color = [[UIColor alloc] initWithPatternImage:tabBarBackgroundImage];
 
  [tabBarBg setBackgroundColor:color];
  [color release];
  [tabBarBackgroundImage release];
 


 }else { //그 외 선택되면  이미지 를 MENU2.png로 변경
  UIImage *tabBarBackgroundImage = [UIImage imageNamed:@"MENU2.png"];
 
  UIColor *color = [[UIColor alloc] initWithPatternImage:tabBarBackgroundImage];
 
  [tabBarBg setBackgroundColor:color];
  [color release];
  [tabBarBackgroundImage release];
 
 }

 }

- (void)dealloc {
    [tabBarController release];
 [tabBarBg release];
    [window release];
    [super dealloc];
}

@end

소스 자체는 어렵지 않죠? ^^
근데 소스 중간에 설명했듯이 didSelectViewController 이 이벤트를 사용할려면 tabBar가 gelegate로 지정되어 있어야 쓸수 있어습니다. 아래 와 같이  연결해주면 tabbar 가 gelegate로 지정이 됩니다.


사용자 삽입 이미지


그럼 실행해 볼까요?

사용자 삽입 이미지


참 쉽죠잉~~

소스파일 첨부합니다 ^^


Posted by 소울입니다
,

iPhone 사용하시다 보면, 다들 이런 경험 있으시죠? ^^

iOS App Store에서 App.을 다운로드 받을때, 20 MB 이상인 녀석들은 3G 인터넷을 통해 다운로드 받을 수 없습니다. 
App Download에 제한이 걸리게 되면, App 판매량에도 분명 영향을 미칠것입니다.

자 그럼 어떻게 이 뚱뚱한 App 녀석을 다이어트 시켜야 할까요?

최근에 알게된 것중에 하나 인데, 소개 해보려고 합니다. 
Stretchable Image 즉, 확대 가능한 이미지를 사용함으로써, Image Size를 줄이고, 궁극적으로는 Application Size를 줄일 수 있습니다.
Android개발을 해보신 분들이라면, 9 patch Image라는 녀석을 아실텐데요, 그녀석과 흡사하지만 덜 파워풀한녀석입니다 ㅎ

 

실험 대상이 될 Image는 바로 요녀석인데요, 요녀석은 40x24 입니다. 
근데 저는 이녀석을 40x24로도 사용하고, 240x24 로도 사용하고 싶습니다.

가장 간단한 방법은 이녀석을 40x24 버전과 240x24버전을 따로 준비 하는것인데, 이러면서 App.이 뚱뚱해지기 시작합니다. 

그럼 어떻게 해야 하냐 ? 범인, 아니 정답은 여기 있습니다 !

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;


이녀석을 이용하면, 일단 UIImage를 Stretchable하게 바꿔줍니다. 


위의 스킨 샷을 보시면, Stretchable한 Image를 이용하지 않고 그냥 UIImageView의 크기만 늘리게 되면, 
두번째 나오는 녀석처럼 쭈욱 늘어나서, 못생긴 녀석이 됩니다. 
그러나 UIImage를 Stretchable한 상태로 만들어 주면 짜잔 , 3번쨰 녀석 처럼 매끈하게 나옵니다. 


UIImage *img = [[UIImage imageNamed:@"image.png"] stretchableImageWithLeftCapWidth:10 topCapHeight:10];

[stretchableView setImage:img];


예제 코드는 위와 같은데요, 
leftCap/topCap 값을 줄수 있어서, 값에 따라 Image를 upscale할때, 특정 픽셀들은 남기고, 아래 값들만 upscale시키게 됩니다. 

애석하게도, 위의 방법은 Interface Builder에서는 할 수 있는 방법이 없기 때문에, 
UIimageView에 Image를 세팅하는것을 소스코드 레벨에서 따로 해줘야 합니다. 

Apple이녀석들은 이런 괜찮은걸 만들어 놨으면, InterfaceBuilder에서도 쓸 수 있게 해줘야지 ;ㅂ; 
친구 녀석 말따라, Apple 애들도 IB를 잘 안써서 그런가 봅니다.

'iOS' 카테고리의 다른 글

어제구하기  (0) 2011.02.17
탭바 커스텀  (0) 2011.02.13
How to popToViewController to a particular Controller or index value of that Controller.  (0) 2011.02.11
iPhone 사진앨범과 같은 썸네일만들기  (0) 2011.02.11
트위터 api  (0) 2011.01.27
Posted by 소울입니다
,
This code is used to popToViewController to the index value of a particular Controller or popToViewController to the Home Screen of your Application.


-(IBAction)btnHome_Clicked:(id)sender{
   
    NSInteger index = -1;
    YourAppicationAppDelegate *appDelegate = (YourAppicationAppDelegate *)[[UIApplication sharedApplication]delegate];
    UINavigationController *navigationController = [appDelegate navigationController];
    NSArray* arr = [[NSArray alloc] initWithArray:navigationController.viewControllers];
    for(int i=0 ; i<[arr count] ; i++)
    {
        if([[arr objectAtIndex:i] isKindOfClass:NSClassFromString(@"UIHomeViewController")])
        {
            index = i;
        }       
    }
    [self.navigationController popToViewController:[arr objectAtIndex:index] animated:YES];
}
Posted by 소울입니다
,

먼저, 출처는 다음 기사입니다.

http://tharindufit.wordpress.com/2010/04/19/how-to-create-iphone-photos-like-thumbs-in-an-iphone-app/

 

iPhone 사진앨범의 특징은 가로나 세로가 긴 이미지라 할지라도,

정사각형으로 사진을 CROP 하고, 썸네일 크기에 맞게 리사이즈 시킵니다.

 

위의 기사의 내용을 나름대로 보기 편하게(?) 수정을 했습니다.

 

함수명 - makeThumbnailImage

파라미터 - 원본 이미지, 리사이즈없이 CROP만 할지 여부, 리사이즈할 정사각형 한변의 길이

리턴값 - CROP 및 리사이즈된 이미지

 

- (UIImage*) makeThumbnailImage:(UIImage*)image onlyCrop:(BOOL)bOnlyCrop Size:(float)size
{
 CGRect rcCrop;
 if (image.size.width == image.size.height)
 {
  rcCrop = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
 }
 else if (image.size.width > image.size.height)
 {
  int xGap = (image.size.width - image.size.height)/2;
  rcCrop = CGRectMake(xGap, 0.0, image.size.height, image.size.height);
 }
 else
 {
  int yGap = (image.size.height - image.size.width)/2;
  rcCrop = CGRectMake(0.0, yGap, image.size.width, image.size.width);
 }
 
 CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rcCrop);
 UIImage* cropImage = [UIImage imageWithCGImage:imageRef];
 CGImageRelease(imageRef);
 if (bOnlyCrop) return cropImage;
 

 NSData* dataCrop = UIImagePNGRepresentation(cropImage);
 UIImage* imgResize = [[UIImage alloc] initWithData:dataCrop];
 
 UIGraphicsBeginImageContext(CGSizeMake(size,size));
 [imgResize drawInRect:CGRectMake(0.0f, 0.0f, size, size)];
 UIImage* imgThumb = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 [imgResize release];
 return imgThumb;
}

위 소스를 참고하시면, 이미지를 CROP 하는 방법이나, 이미지를 RESIZE 하는 방법을 참고하실수 있을겁니다.

 

사족을 붙이자면, 왜 Resize 할지 여부를 따로 분리 시킨 이유는 실제로 사용을 해보면 Resize 루틴에서

많은 CPU 부하가 걸립니다. 그래서 UIImageView 에  contentMode를 UIViewContentModeScaleAspectFit 로 설정해서

자체적으로 리사이즈를 하게 하는 방법이 비동기적으로 괜찮습니다. (물론.. 실제 Resize된 이미지가 아니므로 메모리적인 소비는 있습니다.)

 

많은 도움 되셨으면 좋겠네요 ^^

Posted by 소울입니다
,

트위터 api

iOS 2011. 1. 27. 14:33

우선 트위터 API 관련정보는 http://dev.twitter.com/ 요기에 있구요..

유투브에 간단한 샘플동영상 하나있네요..이분 동영상목록에보면 몇가지 더 있구요..

http://www.youtube.com/watch?v=DkRTVFj6XaA

 

구글에서 검색하시면 언어적 제약사항은 있지만 참고할만한 자료는 있을겁니다.

Posted by 소울입니다
,