Cover Flow特效实现(1)
Cover Flow特效实现(2)
Cover flow是苹果首创的将多首歌曲的封面以3D界面的形式显示出来的方式。如下图所示:
随处可见的Cover Flow特效
特效制作
方法一:UICoverFlowLayer
正式的SDK并未包含UICoverFlowLayer,但是它仍然是标准的uikit。通过steve nygard的类转储(class-dump), 能从uikit框架中提取 UICoverFlowLayer头文件。
由于UICoverFlowLayer是私有的,无法应用于应用程序(无法通过苹果的审查),所以在此简单介绍使用方法:
UICoverFlowLayer *cfLayer = [[UICoverFlowLayer alloc] initWithFrame:frame numberOfCovers:count]; [[self layer] addSublayer:cfLayer];
方法二:OpenFlow
OpenFlow是一个用于实现Cover Flow特效的开源库,它是基于Quartz实现的,能很好的实现Cover Flow特效,同时又易于使用。
下载地址:https://github.com/thefaj/OpenFlow
使用OpenFlow的基本步骤如下:
// CoverFlowViewController.h // CoverFlow // // Created by Avinash on 4/7/10. // Copyright Apple Inc 2010. All rights reserved. // #import #import "AFOpenFlowView.h" @interface CoverFlowViewController : UIViewController { // Queue to hold the cover flow images NSOperationQueue *loadImagesOperationQueue; } @end
- (void)viewDidLoad { [super viewDidLoad]; // loading images into the queue loadImagesOperationQueue = [[NSOperationQueue alloc] init]; NSString *imageName; for (int i=0; i < 10; i++) { imageName = [[NSString alloc] initWithFormat:@"cover_%d.jpg", i]; [(AFOpenFlowView *)self.view setImage:[UIImage imageNamed:imageName] forIndex:i]; [imageName release]; NSLog(@"%d is the index",i); } [(AFOpenFlowView *)self.view setNumberOfImages:10]; }
//delegate protocols // delegate protocol to tell which image is selected - (void)openFlowView:(AFOpenFlowView *)openFlowView selectionDidChange:(int)index{ NSLog(@"%d is selected",index); } // setting the image 1 as the default pic - (UIImage *)defaultImage{ return [UIImage imageNamed:@"cover_1.jpg"]; }
完成上述步骤之后,就可以运行一下程序看一下效果了。虽然与苹果的Cover Flow效果还是有点差距,但还是不错哦。
方法三:FlowCover
FlowCover也是一个开源库,它是基于OpenGL ES。FlowCover的源代码非常简单,只有FlowCoverView和DataCache两个类。这两个类的功能如下:
使用FlowCover的基本步骤如下:
FlowCover中需要实现FlowCoverViewDelegate协议,该协议中主要有三个方法:
-(int)flowCoverNumberImages:(FlowCoverView *)view;
返回FlowCoverView视图中显示的图片数量
-(UIImage *)flowCover:(FlowCoverView *)view cover:(int)cover;
返回FlowCoverView视图中用cover指定的图片
-(void)flowCover:(FlowCoverView *)view didSelect:(int)cover;
当用户触击FlowCoverView中的cover时调用。