A UITransitionView segítségével látványos áttünéseket tudunk megvalósítani két view között. Ilyenek láthatók szerte a telefon programjaiban; ez az, ahol azt látjuk, hogy balra vagy jobbra egymás után csúsznak be a képernyőre az ablakok.
Ahogy a neve is mutatja a UITransitionView a UIView származtatott objektuma, ami a mi szempontunkból azt jelenti, hogy az effektus alkalmazásához ezt a view típust kell elhelyeznünk az adott helyen és ezen belül fogják váltani egymást az el- és előtűnő elemek.
Mielőtt továbblépnénk hadd mutassam meg, hogyan alakítottam át az eredeti header file-t, hogy könnyítésképpen egy enumerációs típust vezessek be, mert ilyen módon számok helyett többet mondó konstansneveket írhatunk (a módosított sorokat más szinekkel jelöltem meg).
UITransitionView.h
#import <UIKit/UIView.h>typedef enum
{
UITransitionShiftImmediate = 0,
UITransitionShiftLeft = 1,
UITransitionShiftRight = 2,
UITransitionShiftUp = 3,
UITransitionFade = 6,
UITransitionShiftDown = 7
} UITransitionStyle;
{
UITransitionShiftImmediate = 0,
UITransitionShiftLeft = 1,
UITransitionShiftRight = 2,
UITransitionShiftUp = 3,
UITransitionFade = 6,
UITransitionShiftDown = 7
} UITransitionStyle;
@interface UITransitionView : UIView
{
UIView *_fromView;
UIView *_toView;
UIView *_firstResponderToRemember;
id _delegate;
struct {
unsigned int animationInProgress:1;
unsigned int ignoresInteractionEvents:1;
unsigned int reserved:30;
} _transitionViewFlags;
}
+ (double)defaultDurationForTransition:(UITransitionStyle)style; // IMP=0x323edd94
- (void)_didCompleteTransition:(BOOL)fp8; // IMP=0x323ede98- (void)_didStartTransition; // IMP=0x323ede44
- (void)_markRememberedFirstResponderFromView:(id)fp8; // IMP=0x323eddf4
- (void)_startTransition:(UITransitionStyle)style withDuration:(float)fp12; // IMP=0x323ee2f8
- (void)_transitionDidStop:(id)fp8 finished:(id)fp12; // IMP=0x323ee2b8- (void)dealloc; // IMP=0x323edca0
- (id)delegate; // IMP=0x323ee288
- (double)durationForTransition:(int)fp8; // IMP=0x323edd08
- (id)fromView; // IMP=0x323ee264
- (BOOL)ignoresInteractionEvents; // IMP=0x323ee290
- (id)initWithFrame:(struct CGRect)fp8; // IMP=0x323edbf4
- (BOOL)isTransitioning; // IMP=0x323ee274
- (void)notifyDidCompleteTransition:(id)fp8; // IMP=0x323ee0ec
- (void)setDelegate:(id)fp8; // IMP=0x323ee280
- (void)setIgnoresInteractionEvents:(BOOL)fp8; // IMP=0x323ee2a0
- (id)toView; // IMP=0x323ee26c
- (BOOL)transition:(UITransitionStyle)style fromView:(id)fp12 toView:(id)fp16; // IMP=0x323ee5fc
- (BOOL)transition:(UITransitionStyle)style toView:(id)fp12; // IMP=0x323ee058
- (BOOL)transition:(UITransitionStyle)style toView:(id)fp12; // IMP=0x323ee058
@end
UITransitionView *trView = [[UITransitionView alloc] initWithFrame: rect];
[trView transition: UITransitionShiftImmediate toView: view1];
Ezt a formát nem csak inicializáláskor használhatjuk, hanem bármikor, amikor view-t akarunk váltani. Az első paraméterben megadott effektussal cserélnek helyet a view-k.[trView transition: UITransitionShiftImmediate toView: view1];
- UITransitionShiftImmediate: azonnal az új view lesz látható
- UITransitionShiftLeft: az új view jobbról balra csúszik be
- UITransitionShiftRight: az új view balról jobbra csúszik be
- UITransitionShiftUp: lentől felfelé csúszik be az új view
- UITransitionShiftDown: fentől lefelé csúszik be az új view
- UITransitionShiftFade: fade-eléssel tűnik elő az új view
[trView transition: UITransitionShiftImmediate fromView: view1 toView: view2];
A transition metódus másik formája a leírások szerint úgy működik, hogy az első view az első paraméterben megadott effektus szerint tűnik el, amíg a második view megjelenik. Az előző transition metódus elméletileg úgy működik, hogy az eredeti view nem mozdul meg, de ezt nem így tapasztaltam. Ha valaki tudná, hogy mi az igazság, világosítson fel.A UINavigationBar az a panel, amin általában bal és jobb oldalon egy gomb jelenik meg, illetve egy cím látható rajta. Ezek is előfordulnak gyakran az eredeti programokban is és a képernyő felső szélén található.
Az előzőhöz hasonlóan itt is bevezettem egy enumerációs típust.
typedef enum
{
UINavigationBarNormal = 0,
UINavigationBarDark = 1,
UINavigationBarDarkSemitransparent = 2
} UINavigationBarStyle;
Az objektum inicializálása érdemes lekérdezni a navigációs sor alapértelmezett méreteit lekérdezni; defaultSize és defaultSizeWithPrompt. {
UINavigationBarNormal = 0,
UINavigationBarDark = 1,
UINavigationBarDarkSemitransparent = 2
} UINavigationBarStyle;
CGSize nsize = [UINavigationBar defaultSize];
Ebből az értékeket az initWithFrame inicializáló eljárásnak adhatjuk át. A showButtonsWithLeftTitle metódussal adhatjuk meg a bal és jobb oldali gomb feliratát - ahova nil értéket írunk, ott nem fog megjelenni gomb. A navigációs sor stílusa három féle lehet: normál, sötét, sötét félig átlátszó. - (void)navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button
A példaprogramhoz két saját view-t készítettem. Az első egy nagyon egyszerű, amint csak egy navigációs sort helyeztem el.
MainView.h
#import <UIKit/UIView.h>#import <UIKit/UIView-Hierarchy.h>
#import <UIKit/UINavigationBar.h>
@interface MainView : UIView {
UINavigationBar *nbMain;
}
- (MainView*)initWithFrame:(CGRect)rect;
- (UINavigationBar*)getNavigationBar;
@end
MainView.m
#import <UIKit/UIHardware.h>#import <UIKit/UINavigationBar.h>
#import <UIKit/UINavigationItem.h>
#import "MainView.h"
@implementation MainView
- (MainView*)initWithFrame:(CGRect)rect
{
[super initWithFrame:rect];
CGSize nsize = [UINavigationBar defaultSize];
nbMain = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, rect.size.width, nsize.height)];
[nbMain pushNavigationItem:[[UINavigationItem alloc] initWithTitle:@"Transition"]];
[nbMain showButtonsWithLeftTitle:nil rightTitle:@"Log" leftBack:NO];
[nbMain setBarStyle: UINavigationBarNormal];
[self addSubview: nbMain];
return self;
}
- (UINavigationBar*)getNavigationBar
{
return nbMain;
}
@end
LogView.h
#import <UIKit/UIView.h>#import <UIKit/UIView-Hierarchy.h>
#import <UIKit/UINavigationBar.h>
#import <UIKit/UITextView.h>
@interface LogView : UIView {
UINavigationBar *nbMain;
UITextView *tvMessage;
}
- (LogView*)initWithFrame:(CGRect)rect;
- (UINavigationBar*)getNavigationBar;
- (void) appendLogMessage: (NSString *) message;
@end
LogView.m
#import <UIKit/UINavigationBar.h>#import <UIKit/UINavigationItem.h>
#import "LogView.h"
@implementation LogView
- (LogView*)initWithFrame:(CGRect)rect
{
[super initWithFrame:rect];
CGSize nsize = [UINavigationBar defaultSize];
nbMain = [[UINavigationBar alloc] initWithFrame: CGRectMake(0.0f, 0.0f, rect.size.width, nsize.height)];
[nbMain pushNavigationItem:[[UINavigationItem alloc] initWithTitle:@"Log"]];
[nbMain showButtonsWithLeftTitle:@"Back" rightTitle:nil leftBack:NO];
[nbMain setBarStyle: UINavigationBarNormal];
tvMessage = [[UITextView alloc] initWithFrame: CGRectMake(0.0f, nsize.height, rect.size.width, rect.size.height)];
[self addSubview: nbMain];
[self addSubview: tvMessage];
return self;
}
- (UINavigationBar*)getNavigationBar
{
return nbMain;
}
- (void) appendLogMessage: (NSString *) message
{
[tvMessage setText:[[tvMessage text] stringByAppendingString: message]];
}
@end
TestAppMain.h
#import <UIKit/UIApplication.h>#import "MainView.h"
#import "LogView.h"
@interface TestAppMain : UIApplication {
UITransitionView *trView;
MainView *vMain;
LogView *vLog;
}
@end
TestAppMain.m
#import <UIKit/UIWindow.h>#import <UIKit/UIHardware.h>
#import <UIKit/UITextView.h>
#import <UIKit/UINavigationBar.h>
#import <UIKit/UITransitionView.h>
#import "TestAppMain.h"
@implementation TestAppMain
- (void) applicationDidFinishLaunching: (id) unused
{
CGRect rect = [UIHardware fullScreenApplicationContentRect];
UIWindow *window = [[UIWindow alloc] initWithContentRect: rect];
rect.origin.x = rect.origin.y = 0.0f;
vMain = [[MainView alloc] initWithFrame: rect];
[[vMain getNavigationBar] setDelegate: self];
vLog = [[LogView alloc] initWithFrame: rect];
[[vLog getNavigationBar] setDelegate: self];
trView = [[UITransitionView alloc] initWithFrame: rect];
[trView transition: UITransitionShiftImmediate toView: vMain];
[window orderFront: self];
[window makeKey: self];
[window _setHidden: NO];
[window setContentView: trView];
[vLog appendLogMessage:@"Application started\n"];
}
- (void)navigationBar:(UINavigationBar*)navbar buttonClicked:(int)button
{
if ([vMain getNavigationBar] == navbar && button == 0){
[trView transition: UITransitionShiftLeft toView: vLog];
[vLog appendLogMessage:@"Transferred to log...\n"];
}else if ([vLog getNavigationBar] == navbar && button == 1){
[trView transition: UITransitionShiftRight toView: vMain];
[vLog appendLogMessage:@"Transferred to main...\n"];
}
}
@end