iOS第三方開源類庫 — 視圖切換 HMGLTransitions

來源:互聯網
上載者:User

HMGLTransitions 是一套動畫示範兩個UIView 或 UIViewController之間切換時的過渡效果;

GitHub:https://github.com/Split82/HMGLTransitions

有些情況下我們需要兩個視圖之間做一個動畫過渡的切換,或許系統內建的CATransition和普通動畫難以滿足我們的需求,此時第三方類庫就是一個不錯的選擇;HMGLTransitions提供五種不錯效果,分別是: 3D Right(letf) 、Cloth、Flip right(letf)、Rotate和Doors

      

  

以上是GitHub上下載內建的Demo展示的五種,展示了兩個UIView  和 兩個UIViewController各自之間動畫切換(中僅展示兩個view之間切換),工程目錄結構:

HMGLTransitions目錄下是這個第三方類庫所有檔案,Transitions檔案下是五種動畫的實作類別,你需要那種動畫就需要把那種動畫標頭檔包含進去


- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {Switch3DTransition *t1 = [[[Switch3DTransition alloc] init] autorelease];t1.transitionType = Switch3DTransitionLeft;FlipTransition *t2 = [[[FlipTransition alloc] init] autorelease];t2.transitionType = FlipTransitionRight;transitionsArray = [[NSArray alloc] initWithObjects:[[[Switch3DTransition alloc] init] autorelease],                            t1,[[[ClothTransition alloc] init] autorelease],[[[FlipTransition alloc] init] autorelease],t2,[[[RotateTransition alloc] init] autorelease],[[[DoorsTransition alloc] init] autorelease],nil];transitionsNamesArray = [[NSArray alloc] initWithObjects: @"Switch 3D right", @"Switch 3D left", @"Cloth", @"Flip left", @"Flip right", @"Rotate", @"Doors", nil]; self.transition = [transitionsArray objectAtIndex:0];}return self;}

初始化視圖,並把這五種動畫效果存放在 transitionsArray數組之中,Switch3DTransition預設向右,FlipTransition預設向左,分別定義了一個t1對象和t2對象,設定t1.transitionType = Switch3DTransitionLeft; 
 t2.transitionType = FlipTransitionRight; 所以transitionsArray存放的是7種效果,對應transitionsNamesArray數組中關於動畫其中效果的名字,顯示在視圖上的UITableViewCell上;兩個數組是一一對應的關係;

兩個UIView之間的動畫過渡切換實現方法

//從View1切換到View2- (void)switchToView2 {UIView *containerView = view1.superview;[[HMGLTransitionManager sharedTransitionManager] setTransition:transition];[[HMGLTransitionManager sharedTransitionManager] beginTransition:containerView];// Here you can do whatever you want except changing position, size or transformation of container view, or removing it from view hierarchy.view2.frame = view1.frame;[view1 removeFromSuperview];[containerView addSubview:view2];[[HMGLTransitionManager sharedTransitionManager] commitTransition];}
//從View2切換到View1- (void)switchToView1 {UIView *containerView = view2.superview;// Set transition[[HMGLTransitionManager sharedTransitionManager] setTransition:transition];[[HMGLTransitionManager sharedTransitionManager] beginTransition:containerView];// Here you can do whatever you want except changing position, size or transformation of container view, or removing it from view hierarchy.view1.frame = view2.frame;[view2 removeFromSuperview];[containerView addSubview:view1];// Commit transition[[HMGLTransitionManager sharedTransitionManager] commitTransition];}

#pragma mark -#pragma mark ModalController delegate- (void)modalControllerDidFinish:(ModalViewController *)modalController {[[HMGLTransitionManager sharedTransitionManager] setTransition:transition];[[HMGLTransitionManager sharedTransitionManager] dismissModalViewController:modalController];}

ModalviewController類中定義一個ModalControllerDelegate協議,定義協議方法- (void)modalControllerDidFinish:(ModalViewController*)modalController;實現兩個View之間的傳值,也就是當我們在UITableViewCell對象上現則哪中過渡效果是的時候,傳遞HMGLTransition對象transition;

[HMGLTransitionManager sharedTransitionManager]使用了單例設計模式

實現兩個UIViewController之間的動畫切換方法

- (IBAction)viewTransitionButtonPressed:(id)sender {UIButton *button = (UIButton*)sender;// view transition to view1 or view2 depending on actual viewif (button.superview == view1) {[self switchToView2];}else {[self switchToView1];}}- (IBAction)modalPresentationButtonPressed:(id)sender {[[HMGLTransitionManager sharedTransitionManager] setTransition:transition];ModalViewController *newController;if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {newController = [[ModalViewController alloc] initWithNibName:@"ModalViewController-iPad" bundle:nil];}else {newController = [[ModalViewController alloc] initWithNibName:@"ModalViewController" bundle:nil];}newController.delegate = self;[[HMGLTransitionManager sharedTransitionManager] presentModalViewController:newController onViewController:self];[newController release];}

示範一個Demo:

   

1.建立一個Single View Application模板工程,命名RollingView,將下載下來的工程中裡HMGLTransitions檔案夾拷貝加入到你的工程目錄中,然後添加 QuartzCore.framework 和 OpenGLES.framework 庫

2. File->New->File 添加一個控制器類ViewController2,在ViewController.h中包含標頭檔

//  ViewController.h#import <UIKit/UIKit.h>#import "Switch3DTransition.h"#import "FlipTransition.h"#import "RotateTransition.h"#import "ClothTransition.h"#import "DoorsTransition.h"#import "ViewController2.h"#import "HMGLTransitionManager.h"@interface ViewController : UIViewController{    UIButton *startBtn;    HMGLTransition *transition;}@end

在ViewController.m中

自訂Button

// custom Button- (UIButton *)buttonWithFrame:(CGRect)frame  withNormalTitle:(NSString *)title  withOtherStateTitle:(NSString *)otherTitle action:(SEL)action {    UIImage *buttonBackgroundImage = [[UIImage imageNamed:@"button_background.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:5];    UIImage *disabledButtonBackgroundImage = [[UIImage imageNamed:@"button_background_disabled.png"] stretchableImageWithLeftCapWidth:5 topCapHeight:5];        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];    button.frame = frame;    [button setTitle:title forState:UIControlStateNormal];    [button setTitle:otherTitle forState:UIControlStateDisabled];    [button setBackgroundImage:buttonBackgroundImage forState:UIControlStateNormal];    [button setBackgroundImage:disabledButtonBackgroundImage forState:UIControlStateDisabled];    [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];    [button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];    [button addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];    [self.view addSubview:button];        return button;}

- (void)viewDidLoad{    [super viewDidLoad];    CGRect butRect = CGRectMake(self.view.bounds.origin.x + 60, self.view.bounds.origin.y + 100, self.view.frame.size.width-60-60, 100);    startBtn= [self buttonWithFrame:butRect withNormalTitle:@"View 1" withOtherStateTitle:@"View 1" action:@selector(startView:)];        Switch3DTransition *tran = [[[Switch3DTransition alloc] init] autorelease];    tran.transitionType = Switch3DTransitionLeft;    transitionArr = [[NSArray alloc] initWithObjects:[[[DoorsTransition alloc] init] autorelease], nil];    self.transition = [transitionArr objectAtIndex:0];        [HMGLTransitionManager sharedTransitionManager];}

點擊Button實現兩個UIViewController之間的動畫切換

-(void)startView:(id)sender{        [[HMGLTransitionManager sharedTransitionManager] setTransition:transition];    ViewController2 *vc2 = [[ViewController2 alloc] initWithNibName:@"ViewController2" bundle:nil];    [[HMGLTransitionManager sharedTransitionManager] presentModalViewController:vc2 onViewController:self];}

在ViewController2類中,方法實現基本類似

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];    if (self) {        FlipTransition *tran = [[[FlipTransition alloc] init] autorelease];        tran.transitionType = FlipTransitionLeft;        transitionArr = [[NSArray alloc] initWithObjects:[[[FlipTransition alloc] init] autorelease], nil];        self.transition = [transitionArr objectAtIndex:0];    }    return self;}- (void)viewDidLoad{    [super viewDidLoad];        CGRect butRect;    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {butRect = CGRectMake(self.view.bounds.origin.x + 60, self.view.bounds.origin.y + 100, 768-60-60, 100);}else {butRect = CGRectMake(self.view.bounds.origin.x + 60, self.view.bounds.origin.y + 100, self.view.frame.size.width-60-60, 100);}        endBtn= [self buttonWithFrame:butRect withNormalTitle:@"View 2" withOtherStateTitle:@"View 2" action:@selector(endView:)];}-(void)endView:(id)sender{    [[HMGLTransitionManager sharedTransitionManager] setTransition:transition];    ViewController *vc1;    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {vc1 = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];        }else {vc1 = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];}         [[HMGLTransitionManager sharedTransitionManager] presentModalViewController:vc1 onViewController:self];}

源碼:http://download.csdn.net/detail/duxinfeng2010/5212826

歡迎轉載分享,請註明出處http://blog.csdn.net/duxinfeng2010

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.