Tag Archives: 개발

[iPhone] UITabBarController에 아이콘 이미지 넣기

UITabBarController에 아이콘 이미지를 넣기 전까지는 어떻게 들어갈지 상상하기 힘듭니다.

그리고 보고 나면 왜 다른 어플들의 모습이 다 비슷비슷한지 다시 한번 느끼게 되는 결과를 얻게 됩니다.

[code]- (void)applicationDidFinishLaunching:(UIApplication *)application {
   
    UITabBarController *tabBarController = [[UITabBarController alloc] init];
    UIViewController *leftViewController = [[UIViewController alloc] init];
    UIViewController *rightViewController = [[UIViewController alloc] init];
   
    leftViewController.tabBarItem.title = @”LEFT”;
    rightViewController.tabBarItem.title = @”RIGHT”;
   
    leftViewController.tabBarItem.image = [UIImage imageNamed:@”test_a_01.png”];
    rightViewController.tabBarItem.image = [UIImage imageNamed:@”test_a_01.png”];
   
    NSArray *tabBarItems = [NSArray arrayWithObjects:leftViewController, rightViewController, nil];
   
    [tabBarController setViewControllers:tabBarItems];
   
    [window addSubview:tabBarController.view];
    [tabBarController.view release];
   
    [window makeKeyAndVisible];
}[/code]

위에서 사용하는 이미지는 다음과 같이 단순한 흰색의 이미지입니다. 알아보기 쉽게 하기 위해 배경에 회색을 깔았습니다.
사용자 삽입 이미지위에서 사용한 A 그림은 실제로는 배경이 투명한 이미지입니다. 그렇다면 실제로 완성된 탭바를 보도록 할까요.
사용자 삽입 이미지예상하신대로인가요? UITabBarController에서는 내가 넣은 이미지의 마스크(Mask)만을 사용하는 것을 알 수 있습니다.

선택된 이미지는 광택처리가 된(?) 하늘색 이미지로 바뀌며(자세히 보시면 그림자까지 들어가 있습니다) 비선택된 이미지는 회색으로 처리 되어있습니다.

이제 탭바를 쓴 앱스들의 아이콘이 모두 동일한 이유를 아시겠나요? 실제로 내가 원하는 이미지를 사용할 수 있도록 할수 있는 방법이 있습니다.

drawRect를 재구현 한다거나, 하지만 쉽고 간편하게 이런것을 구현할 수 있다는 점은 그냥 사용하게 만드는 매력을 가지고 있는 것 같습니다.
1108195223.zip

Java/C++과 Object-C 비교하기

Object-C의 특별한 문법 때문에 처음 접근이 어려우신 분들을 위해 간단하게 문법을 비교하여 보았습니다.

Messages ———————————————————————————————————-
일반적으로 객체의 메서드를 호출하는 것을 Object-C에서는 메세지라고 표현합니다.

특정 객체의 메서드를 호출하는데 Java나 C++에서는 다음과 같이 표현합니다.

// Java
obj.method(parameter);

// C++
obj->method(parameter);

하지만 Object-C에서는 다음과 같이 표현합니다.

// Object-C
[obj method:parameter];

처음 볼때는 정말 어색했는데 자꾸 보다 보니깐 이제 좀 괜찮은거 같습니다. 오히려 소스코드를 볼때 메서드라고 확 튀어 보이니 더 좋은것 같기도 하네요.

Interface ————————————————————————————————————
Object-C에서 말하는 Interface 지시자는 Java나 C++에서 말하는 Class를 뜻합니다. 정확히는 선언부분만이라고 말해야겠군요.

좀더 정확히 말해보자면 메서드의 시그네이쳐를 선언해 둔다는 관점에서 Java에서 말하는 Interface와 비슷할 수도 있겠네요.

C++에서는 헤더파일안에 클래스의 선언부분과 같을 수 있겠고요. 구현부분은 .m 파일에서 합니다.

그렇다면 마찬가지로 Java와 C++의 예제 소스 코드를 보도록 할까요?

// Java
class classname extends superclassname {
    // instance variables
    int memberValue;

    // member methods
    return_type method1(param1_type param1, param2_type param2) { ... }
    return_type method1(param1_type param1, param2_type param2) { ... }
}

// C++
class classname : superclassname {
    // instance variables
    int memberValue;

    // member methods
    return_type method1(param1_type param1, param2_type param2);
    return_type method1(param1_type param1, param2_type param2);
}

Java의 예는 클래스의 구현부분이 클래스에 포함됩니다. Java의 Interface와 비교를 해볼려니 억지같고 추상클래스를 만들자니 또 억지 같아서 그냥 저렇게 써두었습니다.

그럼 Object-C의 구현 부분을 한번 볼까요?

// Object-C
@interface classname : superclassname {
    // instance variables
    int memberValue;
}

// member methods
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2;
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2;
@end

어떤가요? 이해가 되시나요? 그렇다면 이제 클래스의 구현부를 보도록 하겠습니다.

Implementation —————————————————————————————————-
Java의 경우에는 클래스 내부에서 그냥 메서드가 구현되었다고 치고 C++의 예를 한번 살펴 보겠습니다.

// C++
return_type classname::method1(param1_type param1, param2_type param2) {
    ...
}

return_type classname::method1(param1_type param1, param2_type param2) {
    ...
}

Object-C의 문법도 한번 볼 차례군요.

// Object-C
@implementation classname
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2 {
    ...
}
- (return_type)method1:(param1_type)param1 param2_varName:(param2_type)param2 {
    ...
}
@end

Instantiation ——————————————————————————————————–
Object-C 에서는 객체를 생성하는 방법또한 독특한 느낌을 가지고 있습니다. 마찬가지로 비교를 한번 해볼까요?

// Java
MyObject obj = new MyObject();
obj.init();

// C++
MyObject *obj = new MyObject();
obj->init();

자 그렇다면 Object-C에서는 어떻게 하는지 알아볼까요?

// Object-C
MyObject *obj = [MyObject alloc];
[obj init];

혹은 다음과 같이 한줄로 사용할 수도 있습니다.

// Object-C
MyObject *obj = [[MyObject alloc] init];

어떤가요? 굉장히 색다른 느낌인가요?

지금까지 제 생각에 일반 프로그래밍 언어와 가장많이 다른 부분을 정리해 보았습니다. 이정도면 처음 Object-C를 봤을때의 혼란을 줄어들지 않을까 싶네요.

더 공부해 보고 싶으신 분은 [이곳]을 참고해 보시면 애플에서 잘 정리한 문서를 제공하고 있으니 참고하시면 되겠네요.