View transition
If you want to change the
appearance of a view during a transition—for example, flip from one view to
another—then use a container view, an instance ofUIView
,
as follows:
-
Begin an animation block.
-
Set the transition on the container view.
-
Remove the subview from the container view.
-
Add the new subview to the container view.
-
Commit the animation block.
3. RootViewController 마련하기
RootViewController.h
#import <UIKit/UIKit.h>
@interface RootViewController : UIViewController {
IBOutlet UIButton *button1;
}
- (IBAction) OnFlipView;
@end
RootViewController.m
#import "RootViewController.h"
#import "FirstViewController.h"
#import "SecondViewController.h"
// 간편하게 하기 위해 두 뷰 컨트롤러 포인터를 전역 변수로 마련하였다.
FirstViewController* g_FirstViewController = nil;
SecondViewController* g_SecondViewController = nil;
@implementation RootViewController
...
// Implement viewDidLoad to do additional setup after loading the view.
- (void)viewDidLoad {
[super viewDidLoad];
// 두 뷰 컨트롤러를 생성한다.
// Xib의 이름을 넣는다. (이때 대소문자 맞춰야한다. xib를 FIrstView로 해서;; 아래처럼 소스를 짰다. )
g_FirstViewController = [[FirstViewController alloc] initWithNibName:@"FIrstView" bundle:nil];
g_SecondViewController = [[SecondViewController alloc] initWithNibName:@"SecondView" bundle:nil];
// RootViewController의 뷰에 자식 뷰로 g_FirstViewConroller의 뷰를 추가한다. 이 때 button1 자식뷰와 FirstView는 형제 뷰이지만 button1 자식뷰가 firstview보다 앞에 나오게 되어 보이게 된다. (ms윈도우의 z-order과 동일 개념)
// 버튼도 뷰다. UIButton의 클래스 상속을 올라가보면 UIView에서 시작하고 있다.
[self.view insertSubview:g_FirstViewController.view belowSubview:button1];
}
...
// 루트 뷰의 버튼을 누르면 동작되는 뷰전환 함수
- (IBAction) OnFlipView
{
UIViewController *from;
UIViewController *to;
// 루트 뷰 자식(sub) 뷰로 firstview 또는 secondview 중 둘 중 하나만 달라 붙도록 코딩되어 있다.
// 만일 g_FirstViewController.view의 부모뷰(superview)가 있다면 현재 firstview가 붙어 있으므로 firstview에서 secondview로 전환되도록 한다.
if( g_FirstViewController.view.superview != nil )
{
from = g_FirstViewController;
to = g_SecondViewController;
}
else
{
from = g_SecondViewController;
to = g_FirstViewController;
}
// 애니메이션 블럭 시작
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];
[to viewWillAppear:YES];
[from viewWillDisappear:YES];
// 이전 뷰를 부모 뷰(rootview)에서 떼어낸다.
[from.view removeFromSuperview];
// 루트 뷰에다가 전환될 뷰를 추가한다.
[self.view addSubview:to.view];
// 전환될 뷰의 위치는 루트 뷰에 있는 button1과 형제 뷰로써 존재하지만 버튼 보단 뒤에 있게 된다.
[self.view insertSubview:to.view belowSubview:button1];
[from viewDidDisappear:YES];
[to viewDidAppear:YES];
[UIView commitAnimations];
}
@end
FlipViewAppDelegate.h
#import <UIKit/UIKit.h>
@class RootViewController;
@interface FlipViewAppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
IBOutlet RootViewController* root;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
FlipViewAppDelegate.m
#import "FlipViewAppDelegate.h"
#import "RootViewController.h"
@implementation FlipViewAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(UIApplication *)application {
// Override point for customization after application launch
// main window에 자식 뷰로 root뷰를 추가한다.
[window addSubview: [root view]];
[window makeKeyAndVisible];
}
- (void)dealloc {
[root release];
[window release];
[super dealloc];
}
@end
'KB > iPhone 개발' 카테고리의 다른 글
iPhone SDK File I/O 파일 입출력 (4) | 2009.02.12 |
---|---|
iPhone: TabBarItem Image 설정하기 (0) | 2009.01.28 |
iPhone: Editing on UITableView (0) | 2009.01.23 |
iMobileCinema - 아이팟 터치에서 사파리에서 플래시 보기 (2) | 2009.01.23 |
iPhone: Inserting on UITableView (0) | 2009.01.22 |