Research Topics/iPhone SDK2009. 4. 14. 18:30

iPhone SDK 의 MediaPlayer 를 사용하기 위해선 다음 두가지 프레임웍을 추가해줍니다.
AVFoundation.framework
MediaPlayer.framework



헤더파일에는 다음과 같이 MPMoviePlayerController 를 선언합니다.
MovieViewController.h
#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>


@interface AboutViewController : UIViewController {
    MPMoviePlayerController *player;
}

@property (nonatomic, retain) MPMoviePlayerController *player;

- (IBAction)playVideoWithControls;
- (IBAction)playVideoWithoutControls;

@end

구현은 다음과 같습니다. 번들의 file 을 플레이하는 방식과 웹상의 URL 을 통한 스트리밍 방식 모두 가능합니다.
MovieViewController.m
#import "MovieViewController.h"


@implementation MovieViewController
@synthesize player;

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
    self.title = @"Movie Player";
   
    [self playVideoWithControls];
}


- (void)playVideoWithURL:(NSURL *)url showControls:(BOOL)showControls {
    if (!player) {
        player = [[MPMoviePlayerController alloc] initWithContentURL:url];
       
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didFinishPlaying:) name:MPMoviePlayerPlaybackDidFinishNotification object:player];
       
        if (!showControls) {
            player.scalingMode = MPMovieScalingModeAspectFill;
            player.movieControlMode = MPMovieControlModeHidden;
        }
       
        [player play];
    }
}

- (IBAction)playVideoWithControls {
    NSString *path = [[NSBundle mainBundle] pathForResource:@"test_movie" ofType:@"m4v"];

    NSURL *url = [NSURL fileURLWithPath:path];
    //NSURL *url = [NSURL URLWithString:@"http://cdsig.tistory.com/test_movie.m4v"];
   
    [self playVideoWithURL:url showControls:YES];
}

- (IBAction)playVideoWithoutControls {
    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"test_movie" ofType:@"m4v"];
    NSURL *url = [NSURL fileURLWithPath:moviePath];
   
    [self playVideoWithURL:url showControls:NO];
}

- (void)didFinishPlaying:(NSNotification *)notification {
    if (player == [notification object]) {   
        [[NSNotificationCenter defaultCenter] removeObserver:self name:MPMoviePlayerPlaybackDidFinishNotification object:player];
        [player release];
        player = nil;
    }
    [self.navigationController popViewControllerAnimated:YES];

}


위의
didFinishPlaying 함수에서 MoviePlayer 종료시 후처리를 할 수 있습니다.
SDK 의 시뮬레이터에서 동영상이 플레이되지 않으면 DivX 등 기타 추가로 설치한 코덱을 지워주면 된다고합니다.


좀더 다양한 MoviePlayer 의 세부 컨트과 사용자 제작 그래픽의 영상 오버레이 처리 등은 iPhone Dev Center 의 Sample code 들 중 MoviePlayer 라는 샘플 코드를 보시면 됩니다.
Posted by 알 수 없는 사용자
Research Topics/iPhone SDK2009. 2. 21. 14:16
  


1. Navigation-Based Application 으로 프로젝트 생성
   - AppDelegate 와 RootViewController 가 기본적으로 생성됨
   - 이때 RootViewController 는 UITableViewController 를 상속받고, tableView 라는 UITableView 를 담고 있음
      그리고, AppDelegate 의 UINavigationController 에서 보여지는 첫 화면이 됨
   - AppDelegate 는 UINavigationController *navigationController 를 담고 있음 
 
2. RootViewController의 tableView 를 위한 모델(데이터) 생성
   - AppDelegate의 applicationDidFinishLaunching와 같은 초기화 부분에서 NSArray 등의 데이터 생성
   - RootViewController 는 UITableViewController를 상속받으므로, tableView와 관련된 메소드가 정의되어 있음
      이 메소드들을 수정하여 데이터를 채워줄 수 있도록 함
      (numberOfSectionsInTableView, numberOfRowsInSection, cellForRowAtIndexPath)

3. 메뉴 선택시 로드될 UIViewController 추가 
   - Add - New File - UIViewController subclass 또는 기타 목적에 맞는 클래스 선택
   - xib 파일도 RootViewController.xib 등을 열어 새이름으로 저장, 새클래스 이름 지정

4. 하위 계층의 새로운 UI 로딩(push) 구현
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 부분에서
       하위 계층의 새로운 UIViewController (또는 다른 UIView 화면)를 로딩하도록 구현 (pushViewController 사용)

       예)
        AboutViewController *aboutViewController = [[AboutViewController alloc]
        initWithNibName:@"AboutViewController" bundle:nil];
        [self.navigationController pushViewController:aboutViewController animated:YES];
        [aboutViewController release];

    - 이때 self.navigationController 는 UINavigationController 에 담긴 View controller 라면 접근 가능하도록 되어있음
     
5. 하위계층에서 복귀(pop)는 특별히 구현하지 않아도 됨
    - UINavigationController 의 Back 버튼 처리가 자동으로 됨
    - 다른 버튼 등을 사용한 수동 구현시는 [self.navigationController popViewControllerAnimated:YES]; 사용



Posted by 알 수 없는 사용자
Research Topics/iPhone SDK2009. 2. 21. 14:15

안녕하세요 박동윤입니다.
지난 Hello sadi! 프로젝트에 가속도 센서의 데이터를 받아 이미지를 움직이는 부분을 추가해보도록 하겠습니다.

단, 지난 프로젝트에서 Window-Based Application 으로 시작한 것과는 달리 View-Based Application 으로 제작하도록 하겠습니다. (ViewController를 사용)

특별히 다른 것은 없고 Window-Based Application 으로 생성한 프로젝트에서는 AppDelegate 만 존재하여, 우리가 UIView 를 상속한 MyView 라는 클래스를 직접 파일 생성하여 추가해주었습니다만, View-Based Application 에서는 AppDelegate 과 함께 ViewController 라는 것이 생성됩니다. 이 ViewController 는 이미 View 를 담고 있기에 이를 바로 사용하면 됩니다.

View-Based Application 으로 프로젝트 생성



저는 HelloSADIAccel 이라는 이름으로 프로젝트를 생성하였습니다


다음과 같이 AppDelegate 와 ViewController 가 기본적으로 생성됩니다


HelloSADIAccelAppDelegate.h 를 보면 다음과 같이 HelloSADIAccelViewController 를 담고 있습니다.
#import <UIKit/UIKit.h>

@class HelloSADIAccelViewController;

@interface HelloSADIAccelAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    HelloSADIAccelViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet HelloSADIAccelViewController *viewController;

@end

HelloSADIAccelAppDelegate.m 을 보면 HelloSADIAccelViewController 의 view 를 addSubview 로 window에 추가하는 것을 볼 수 있습니다. 즉, 우리는 이미 존재하는 HelloSADIAccelViewController 의 view 를 사용하면 됩니다.
#import "HelloSADIAccelAppDelegate.h"
#import "HelloSADIAccelViewController.h"

@implementation HelloSADIAccelAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {   
   
    // Override point for customization after app launch   
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}


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


@end

HelloSADIAccelViewController.xib 을 더블클릭하여 인터페이스빌더를 실행하고, 지난번 프로젝트와 동일하게 UI 제작을 합니다. 지난번 처럼, 일단 SADI_LOGO.png 를 프로젝트의 Resource 폴더에 Add 해야겠지요. (지난 세미나자료 참조)

  


 
  

역시 주의할점은 다음과 같이 File's Owner 를 선택한 상태에서 (HelloSADIAccelViewController가 선택된 상태에서)위의 Action/Outlet 연결작업을 해야합니다. 종종 다른 요소의 정보창이 표시된 상태에서 하는 경우가 있습니다.
이때 File's Owner 는 HelloSADIAccelViewController 자신이라고 보면 됩니다.(인스턴스)


제작이 끝났으면 일단 File - Save 하여 수정된 인터페이스 정보를 xib 파일에 저장하고,
다시, File 메뉴의 Write Class Files 를 눌러 변경사항을 기록합니다. 이때 Merge 를 선택하여 기존 클래스에
정보를 추가합니다.





Merge 를 누르면 머지 프로그램이 실행되고 두 코드를 비교하는데,
키보드의 좌우키와 상하키를 이용하여 다음과 같이 변경/추가된 내용들을 좌측 (추가된 내용) 으로 선택하고 save 해줍니다.




HelloSADIAccelViewController.m 파일에 다음과 같이 버튼이 눌렸을때 텍스트가 바뀌도록 수정합니다. (지난번과 동일)

#import "HelloSADIAccelViewController.h"

@implementation HelloSADIAccelViewController
- (IBAction)button1Pressed {
    textLabel.text = @"Communication Design";
}

- (IBAction)button2Pressed {
    textLabel.text = @"Fashion Design";
}

- (IBAction)button3Pressed {
    textLabel.text = @"Product Design";
}




이제 View-Based Application 템플릿으로 지난번과 같은 내용이 완성이 되었습니다.
여기서 가속도 센서를 사용하여 로고를 움직이는 부분을 추가하도록 하겠습니다.

다음과 같이 HelloSADIAccelAppDelegate.h 에 UIAccelerometerDelegate 를 추가해줍니다.
#import <UIKit/UIKit.h>

@class HelloSADIAccelViewController;

@interface HelloSADIAccelAppDelegate : NSObject <UIApplicationDelegate, UIAccelerometerDelegate> {
    UIWindow *window;
    HelloSADIAccelViewController *viewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet HelloSADIAccelViewController *viewController;

@end

HelloSADIAccelAppDelegate.m 에는 다음과 같이 추가하여 가속도 센서를 초기화 하고 didAccelerate 를 구현합니다.
setUpdateInterval 은 말그대로 초당 업데이트 회수(Hertz)를 지정해주는 부분입니다.
#import "HelloSADIAccelAppDelegate.h"
#import "HelloSADIAccelViewController.h"

@implementation HelloSADIAccelAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {   
    // Configure and start the accelerometer
    [[UIAccelerometer sharedAccelerometer] setUpdateInterval:(1.0 / 40)];
    [[UIAccelerometer sharedAccelerometer] setDelegate:self];
   
    // Override point for customization after app launch   
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

- (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    [viewController handleAccelerometerX:acceleration.x Y:acceleration.y Z:acceleration.z];
}

- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}
@end

위에서 handleAccelerometerX:Y:Z: 는 우리가 ViewController 에 구현하여 이미지를 움직일 메소드 입니다.

그럼 다음과 같이 HelloSADIAccelViewController.h 에 메소드를 정의를 하고
#import <UIKit/UIKit.h>

@interface HelloSADIAccelViewController : UIViewController {
    IBOutlet UIButton *button1;
    IBOutlet UIButton *button2;
    IBOutlet UIButton *button3;
    IBOutlet UIImageView *imageSADI;
    IBOutlet UILabel *textLabel;
}
- (IBAction)button1Pressed;
- (IBAction)button2Pressed;
- (IBAction)button3Pressed;
- (void)handleAccelerometerX:(float)x Y:(float)y Z:(float)z;

@end

HelloSADIAccelViewController.m 에 다음과 같이 구현을 합니다.
x, y 축 기울기 에 따라 로고 이미지가 좌우 상하로 움직이게 됩니다.

가속도 센서는 시뮬레이터에서는 테스트 불가능하며, 기기에서만 테스트 가능합니다.
#import "HelloSADIAccelViewController.h"

@implementation HelloSADIAccelViewController
- (IBAction)button1Pressed {
    textLabel.text = @"Communication Design";
}

- (IBAction)button2Pressed {
    textLabel.text = @"Fashion Design";
}

- (IBAction)button3Pressed {
    textLabel.text = @"Product Design";
}

- (void)handleAccelerometerX:(float)x Y:(float)y Z:(float)z {
    if(y<-0.5)   
        imageSADI.center = CGPointMake(imageSADI.center.x, imageSADI.center.y+3);
    if(y>0.5)
        imageSADI.center = CGPointMake(imageSADI.center.x, imageSADI.center.y-3);
    if(x<-0.5)   
        imageSADI.center = CGPointMake(imageSADI.center.x-3, imageSADI.center.y);
    if(x>0.5)
        imageSADI.center = CGPointMake(imageSADI.center.x+3, imageSADI.center.y);
   
}


Posted by 알 수 없는 사용자
Research Topics/iPhone SDK2009. 2. 16. 01:44
지난번 예제에서 터치시에 간단한 짧은 사운드를 플레이하는 예제입니다.

일단, 가장먼저 사운드를 사용하기 위하여 AudioToolbox 라는 프레임웍을 프로젝트에 추가해주어야 합니다.







그리고 프로젝트에 짤막한 사운드파일 (wav나 mp3 등)을 추가해 줍니다. 저는 cling_1.wav 라는 파일을 추가했습니다.



기본적으로, 사운드를 사용하는 예제들은 같은 방법을 사용하기에, 애플의 iPhone Dev Center 에서 제공하는
sample code 중 사운드를 사용하는 것을 하나 골라잡아 다운로드를 합니다.

저는 GLPaint 라는 그림그리기 app 예제를 받았습니다.
받은 dmg 파일을 를 열어 프로젝트를 열면 다음과 같이 SoundEffect.h 와 SoundEffect.m 파일이 있습니다. 
두 파일을 그대로 마우스로 드래그하여 우리가 만들었던 Hello sadi 프로젝트에 집어넣습니다.
이때 뜨는 창에서는 Copy ... 를 체크하여 아예 파일을 우리의 프로젝트 폴더로 실제로 복사해 오도록 해줍니다.



SoundEffect.h 에는 다음과 같은 내용이 보입니다.
SoundEffect 라는 class 를 정의해 놓은 부분입니다.

initWithContentsOfFile 이라는 함수와 play 라는 함수가 보이네요. 기능은 이름만 봐도 알 수 있겠죠?
사운드 파일과 함께 초기화 하고, 사운드를 플레이를 해주는 함수 인것을 예상할 수 있습니다.
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>

@interface SoundEffect : NSObject {
    SystemSoundID _soundID;
}

+ (id)soundEffectWithContentsOfFile:(NSString *)aPath;
- (id)initWithContentsOfFile:(NSString *)path;
- (void)play;

@end

SoundEffect.m 에는 위의 내용들이 구현이 되어있습니다만, 굳이 자세히 알 필요는 없습니다.
우리는 이를 활용해서 play 만 하면 되니까요.

그럼, 우리가 만들었던 MainView의 헤더인 MainView.h 로 가서 다음과같이 사운드 부분을 추가해 줍니다.
위에서 가져온 SoundEffect 라는 클래스의 인스턴스변수를 추가해 주어 MainView 에서 사용할 예정입니다.
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "SoundEffect.h"


@interface MainView : UIView {
    IBOutlet UIProgressView *alphaProgress;
    IBOutlet UISlider *alphaSlider;
    IBOutlet UILabel *alphaText;
    IBOutlet UIImageView *imageView;
    IBOutlet UIButton *button1;
    IBOutlet UIButton *button2;
    IBOutlet UIButton *button3;
    IBOutlet UIBarButtonItem *playButton;
   
    SoundEffect *soundEffect;
}
- (IBAction)changeAlpha;
- (IBAction)changeAlphaButton1;
- (IBAction)changeAlphaButton2;
- (IBAction)changeAlphaButton3;
@end

구현부분인 MainView.m 에서는 다음과 같이 추가를 합니다.
awakeFromNib 은 앞서 예제에서 사용했던 Interface Builder 의 파일인 .xib
(과거에는 .nib이었기에 주로 nib이라고아직도 부릅니다) 에서 불리는 함수 입니다.
다음과같은 코드로 사운드 파일을 로드할 수 있습니다. (이경우는 cling_1.wav 파일 입니다)
-(void)awakeFromNib {
    NSBundle *mainBundle = [NSBundle mainBundle];
    soundEffect =
            [[SoundEffect alloc] initWithContentsOfFile:[mainBundle pathForResource:@"cling_1" ofType:@"wav"]];
}


이제 사운드 로드과정이 완료되었으므로, 원하는 부분에서 play 만 해주면 됩니다.
play는 아주 간단히 다음코드 한줄로 끝입니다.
[soundEffect play];

저는 터치가 되었을때 소리가 나도록 touchesBegan 에 넣었습니다.
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [soundEffect play];
}

이제, 손가락으로 화면을 터치할때마다 cling_1.wav 사운드가 들리게 됩니다.

Posted by 알 수 없는 사용자
안녕하세요 박동윤입니다. 
지난 1월24일에 진행했던 세미나를 정리해드립니다. 천천히 다시 보시면 도움 되실겁니다 ^^
설명드렸던 간단한 터치 어플리케이션에 대한 제작 과정 설명입니다.

ADC 가입, SDK 및 문서 받기, iPhone Developer Program 등에 대한 것은 앞선 글을 참고하세요
(메일로 보내드렸던 글입니다)

1. Xcode 실행 및 프로젝트 생성



File - New Project 에서 Window-Based Application 을 선택합니다.
저희는 Windows 만 생성된 맨바탕에 View를 만들고 요소들을 추가할 예정입니다.

프로젝트 이름은 HelloSADI 와 같이 원하는 이름을 적어주시면 됩니다.
위치도 데스크탑이나 원하는 폴더에 저장하시면 됩니다.




다음 두개의 png 파일을 데스크탑에 저장하시고





프로젝트의 Resources 폴더에서 오른쪽클릭, Add - Existing Files 를 선택하셔서 추가해 줍니다.
이때 Copy items into destination group's folder 를 체크하셔서 프로젝트 폴더로 복사가 되도록 합니다.





2. 인터페이스 빌더 실행하기

프로젝트 파일들 중 Resources 의 MainWindow.xib 파일이 인터페이스 빌더(Interface Builder)의 파일입니다.
더블클릭하시면 인터페이스 빌더가 실행됩니다.



3. UI 구현

Interface Builder 가 실행되면 다음과 같은 네개의 창이 보입니다.
Inspector 가 안보이시면 Toos - Inspector 를 선택하여 보이도록 합니다.





UI요소들중 제일먼저 View 를 끌어다 화면 꽉차게 놓습니다. 이 View 가 바탕이 되는 View 이고,
다른 View 들을 담게 됩니다.

그리고, Inspector 창에서 다음과 같이 네번째 탭(identity) 을 보시면 Class 에 UIView라고 적혀있습니다.
이걸 적절한 이름으로 바꿔줍니다. 저의경우는 MainView 라고 하겠습니다.




이제 UIView 를 바탕에 깔았으므로 UI요소들을 넣겠습니다.
sadi 로고를 담기위해 Image view 를 끌어다 놓고 적당한 크기로 조절합니다.




Inspector 창은 왼쪽 창에서 선택된 UI 요소들에 대한 정보를 보여줍니다.
Image View 가 선택된 상태에서 Inspector 의 첫번째 탭 (Attributes)를 눌러 Image 의 목록을 펼쳐
sadi logo 의 png파일을 선택해 줍니다.
 


이번엔 Label 을 끌어다 놓고 화면 양끝에 적절한 길이로 늘여 배치를 하고 역시 Attribute 에서 가운데정렬로 바꿔줍니다.


이 Label을 더블클릭하면 텍스트를 바꿀 수 있는데, Hello sadi! 라고 입력하겠습니다.



같은 방법으로, Round Rect Button 을 끌어다 화면 아랫쪽에 배치합니다.
세개를 배치하시고, 버튼을 더블클릭하면 버튼의 텍스트를 입력할 수 있는데
CD, PD, FD 라고 각각 입력하겠습니다.





저장 (File-save)하시고, Xcode 로가셔서 Build and Go 를 눌러 실행해 봅니다.



구성한 UI 요소들이 잘 보입니다. 단 버튼들을 눌러도 아무 인터렉션은 없습니다.
지금 우리는 단지 껍데기만 만들어 놓은 것에 불과하니까요.
이제 무언가 인터렉션이 있도록 하려면 그러한 코드를 작성해서 연결을 해주면 되겠죠?

글이 길어져서 2부로 나누었습니다. 다음글로 이동하세요~

Posted by 알 수 없는 사용자

4. Code 와의 연결

 
다른 프로그램/언어들도 그렇듯이 우리가 배치한 요소들(이미지, 텍스트레이블, 버튼)들을
제어하고 변화를 주기위해서 이들을 담기위한 변수(?)를 만들어 줍니다.

위의 UI 요소들은 Interface builder (이하 IB라고 부르겠습니다)를 사용하지 않고 순수히 코딩으로만 가능하지만,
우리는 IB를 사용하여 만들었으므로, IB에서 실제 코드와 연결될때 매칭될 변수 정보를 만들어주어야 합니다.

인터페이스 빌더에서 화면의 흰바탕(MainView)를 클릭해서 Inspector 창에 Main View 의 identity 가 나타나도록
합니다. (다른 UI요소를 클릭하면 해당 요소의 identity 가 나오므로 주의)


Class Outlets 에서 + 를 눌러 다음과 같이 추가합니다. 버튼세개와 sadi 로고 이미지, 텍스트레이블에 대한
변수들 입니다. 따라서 이름은 마음대로 하셔도 됩니다. 단 Type 은 int, char, float 와 같은 변수의 타입이므로
알맞게 해당 타입을 적어주셔야 합니다.



다음에는 Class Actions 에서 다음과같이 각 버튼이 눌렸을때 불려질 함수명를 적어줍니다.
역시 이름은 마음대로 하셔도 됩니다. 타입은 id로 놔둡니다.



최종적으로 다음과 같은 화면입니다.



이제는 우리가 작성한 변수들을 각 UI요소들과 연결 해주면 됩니다.
두번째 탭 (Connections)를 클릭해보면 다음과 같이 우리가 작성한 변수와 함수(Action)들이 목록에 나타나 있습니다.


각 변수의 우측에 동그라미가 달려있는데, 이것을 클릭한채로 드래그 하셔서 해당 UI요소에 연결해 줍니다.


Action의 경우도 해당 버튼에 연결해주면 되는데, 이때 버튼의 어떤 경우에 불리게 할 것인지 메뉴가 뜹니다.
우리는 터치가 되었을때 Action 이불리도록 할 것이므로 Touch Down 을 선택해 줍니다.



모두 연결하면 다음과 같습니다.



이제 UI요소 배치, 변수 작성, 1:1 연결까지 다 마쳤으므로 실제 코드 생성을 하면 됩니다.
File - Save 하셔서 한번 저장을 일단 해주시고,
File - Write Class Files 를 눌러 실제 클래스파일을 생성합니다.



다음과 같이 우리가 이름지었던 MainView 라는 이름으로 저장이 됩니다.
(혹시 UIWindow 나 엉뚱한 이름이 나오면 화면에서 흰바탕 MainView 가 아닌 다른 요소가 선택된
상태로 Write Class 파일을 눌러서 그렇습니다.)



다음과 같은 물음이 나오는데, 물론 프로젝트에 파일을 추가할 것이므로 체크를 하고 Add 합니다.


이제 Interface Builder 에서 할일은 끝났습니다. 종료하시고 Xcode 로 갑니다.
다음과 같이 생성된 MainView.h 와 MainView.m 파일이 잘 들어와 있습니다.




5. Code 작성

우선 MainView.h 파일을 보면 다음과같이 되어있습니다.
IB에서 작성했던 변수들과 함수명들이 잘 들어와있습니다.
단, 우리가 UIView 를 MainView 로 이름을 바꾸었으므로, UIView 를 상속하도록 수정을 해야합니다.



MainView : 다음의 주석부분을 지우고 다음과 같이 UIView 로 고쳐줍니다.



이제 MainView.m 파일로 가보면 다음과 같이 우리가 정의해놓은, 각 버튼이 눌렸을때
불릴 함수들이 있습니다. 이제 기능을 구현해 넣으면 되겠죠.



다음과 같이 각 버튼이 눌렸을때 텍스트 label 에 텍스트를 표시하도록 합니다.
labelText.text 와 같은 모양은 플래시의 액션스크립트나 프로세싱에서도
많이 보아오셨던 것이라 쉽게 이해하실 수 있을겁니다.
특이한 점이라면, 문자열앞에 골벵이 @를 붙여야 합니다. (문서들 참조)



이제 Build and Go를 눌러 실행해 봅니다.



각 버튼을 누르면 해당 텍스트가 잘 표시 됩니다.

마지막으로 터치기능을 추가해 sadi 로고를 손가락으로 움직여 보겠습니다.
Xcode 의 Help 메뉴에서 Documentation 을 선택합니다.



우측 상단의 검색창에서 Touches 라고 쳐보면 다음과같이 터치관련 API 가 여러개 나옵니다.


우리는 터치된 손가락을 움직일때 이미지가 따라서 움직이게 할 것이므로 touchesMoved 를 선택합니다.
선택해서 나온 설명에서 바로 보이는 함수명
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
을 그대로 긁어서 복사합니다.


그리고 Xcode 로가서 우리의 MainView.m 파일에 다음과 같이 붙여넣기 한후
괄호를 열고 닫아서 함수로 만들어 줍니다. { }
즉 터치 이벤트가 일어나면 시스템(iPhone OS)에서 이 함수를 불러주는 것이므로, 우리가 이 함수안에
무언가 기능을 만들어 놓으면, 터치가 될때마다 그 기능이 실행이 되겠지요.



위의 touchesMoved 함수안에 다음과 같이 내용을 구현합니다. (복사해서 붙여넣으세요)
단, imageSADI 는 자신이 정한 sadi logo 이미지에 대한 변수이름으로 바꿔주셔야겠죠?

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    for (UITouch *touch in touches) {
        if (CGRectContainsPoint([imageSADI frame], [touch locationInView:self])) {
            imageSADI.center = [touch locationInView:self];
        }
    }
}

내용을 보면 touchesMoved라는 함수가 불려질때 touches 라는 오브젝트 안에 터치에 대한
좌표등의 정보가 들어있습니다. 이때 for 문으로 각 touch 정보들을 꺼내서
우리는 imageSADI 의 frame (이미지 크기라고 이해하면 됩니다) 안에 touch의 좌표가
들어 있는가를 판단해서 있다면 터치가 이미지 크기 안에서 이루어 진 것이므로
이미지의 center 좌표를 터치좌표로 대치한다는 내용입니다.

이것이 손가락이 움직일때 반복적으로 불리고 이미지좌표가 터치좌표로 덮어써지므로
드래그가 되는것 처럼 보이겠죠.



이미지를 터치해서 움직여보면 잘 따라 다닙니다.

*아이콘 파일 지정
Resources 폴더에 보시면 Info.plist 라는 파일이 있습니다. 여기서 Icon file 의 값을 icon.png 로 주시면 됩니다.



이외에 메모리 관리를 위한 처리를 해주어야 하는 부분이 추가적으로 있습니다만
일단은 여기까지로 마무리 하도록 하겠습니다.

다른 UI요소 (Slider)를 추가하고 이미지의 알파값을 바꿔보는 것 까지 했었습니다만,
그부분은 다음시간에 한번 다시 간단하게 같이 해보도록 하겠습니다.

수고하셨습니다 ^^

 




Posted by 알 수 없는 사용자