HTML

Hackstock

Hack the planet! Hackers unite!

Címkék

Címkefelhő

NavigationBar és Transition

2007.12.08. 22:56 :: theshadow

Most két új objektummal fogunk megismerkedni: UITransitionView és UINavigationBar.
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;

@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

@end
Használata rendkívül egyszerű. Inicializálni a initWithFrame metódussal tudjuk, mint a UIView-t. Az első megjelenítendő view-t a transition metódus második formájával szoktam megadni.
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.
  • 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.
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ó.
   
A sor számára delegált objektumot is adhatunk meg, ami akkor hívódik meg, ha egyik gombot a felhasználó megnyomja. A metódus szignatúrája a következőképpen néz ki.
- (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
A másik egy log view lesz, ahova néhány üzenetet fogunk összegyüjteni a program futása során.
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
A főprogram pedig a következőképpen fogja össze a két view-nkat.
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

Szólj hozzá! · 1 trackback

Címkék: iphone appdev

A bejegyzés trackback címe:

https://hackstock.blog.hu/api/trackback/id/tr93257379

Trackbackek, pingbackek:

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.