`
lovebirdegg
  • 浏览: 175431 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

iPhone手把手教你做CoverFlow

阅读更多
原文地址:iPhone手把手教你做CoverFlow!!
http://www.aisidechina.com/forum/viewthread.php?tid=799
大家好,今天来给大家讲讲iPhone里面的CoverFlow技术。



      CoverFlow 并未加入的苹果的官方SDK,但是它仍然是标准的UIKit,因此我么可以提取出UICoverFlowLayer.h文件。那我们怎么生成CoverFlow效果呢?下面一步教你怎么实现简单的CoverFlow效果:首先建立一个View based Application。

名字随便起就行 这里我命名为CoverFlow如图:

接下来新建一个空文件,然后将 UICoverFlowLayer.h 里面的代码拷贝进去,
命名为 UICoverFlowLayer.h
UICoverFlowLayer.h
*/
@interface UICoverFlowLayer : NSObject // CALayer
{
    void *_private;
}

- (id)initWithFrame:(struct CGRect)fp8 numberOfCovers:(unsigned int)fp24 numberOfPlaceholders:(unsigned int)fp28;
- (unsigned int)numberOfCovers;
- (unsigned int)numberOfPlaceholders;
- (void)dealloc;
- (void)setDelegate:(id)fp8;
- (void)setPlaceholderImage:(void *)fp8 atPlaceholderIndex:(unsigned int)fp12;
- (void)setPlaceholderIndicesForCovers:(unsigned int *)fp8;
- (void)_prefetch:(unsigned int)fp8 atIndex:(unsigned int)fp12;
- (void)_requestBatch;
- (void)_requestImageAtIndex:(int)fp8 quality:(unsigned int)fp12;
- (void)_requestImageAtIndex:(int)fp8;
- (void)_notifySelectionDidChange;
- (void)transitionIn:(float)fp8;
- (void)transitionOut:(float)fp8;
- (void)transition:(unsigned int)fp8 withCoverFrame:(struct CGRect)fp12;
- (void)transitionIn:(float)fp8 fromFrame:(struct CGRect)fp12;
- (void)transitionOut:(float)fp8 toFrame:(struct CGRect)fp12;
- (void)setDisplayedOrientation:(int)fp8 animate:(BOOL)fp12;
- (void)setInfoLayer:(id)fp8;
- (void)setImage:(void *)fp8 atIndex:(unsigned int)fp12 type:(unsigned int)fp16;
- (void)setImage:(void *)fp8 atIndex:(unsigned int)fp12 type:(unsigned int)fp16 imageSubRect:(struct CGRect)fp20;
- (void)setImage:(void *)fp8 atIndex:(unsigned int)fp12;
- (unsigned int)indexOfSelectedCover;
- (unsigned int)_coverAtScreenPosition:(struct CGPoint)fp8;
- (void)_recycleLayer:(int)fp8 to:(int)fp12;
- (void)_setNewSelectedIndex:(int)fp8;
- (void)_updateTick;
- (void)displayTick;
- (void)dragFlow:(unsigned int)fp8 atPoint:(struct CGPoint)fp12;
- (void)selectCoverAtIndex:(unsigned int)fp8;
- (void)selectCoverAtOffset:(int)fp8;
- (unsigned int)coverIndexAtPosition:(float)fp8;
- (void)_setupFlippedCoverLayer:(id)fp8;
- (void)flipSelectedCover;
- (int)benchmarkTick;
- (void)benchmarkHeartbeatLongScrub;
- (void)benchmarkHeartbeatShortScrub;
- (void)benchmarkHeartbeatScrubAndWait;
- (void)benchmarkTightLoop;
- (void)benchmarkTightLoopScrub;
- (BOOL)benchmarkLoadScrub;
- (BOOL)benchmarkImageManager:(void *)fp8;
- (void)benchmarkSetEnv;
- (void)benchmarkMode:(int)fp8;
- (void)benchmarkTickMode:(int)fp8;
- (void)benchmarkImageMode:(int)fp8;
- (void)benchmarkPerformanceLog:(BOOL)fp8;
- (void)benchmarkTightLoopTime:(unsigned int)fp8;
- (void)benchmarkLongScrubSpeed:(float)fp8;
- (void)benchmarkSkipImageLoad:(BOOL)fp8;

@end
首先介绍一下CFLayer,iPhone开发过程中,我们直接控制的是UIView,而不是
Layer,UIView 相当于Layer的一个子类,因此我们要想显示我们的CoverFlowLayer,就必须
建立一个UIView,来充当我们Layer的容器。

新建一个UIView的子类,并选中also create .h
这里我命名为CoverFlowView 接下来我们将在CoverFlowView 里面初始化我们的Layer
- (CoverFlowView*)initWithFrame:(CGRect)aRect addCount:(NSInteger)count {
	self = [super initWithFrame:aRect];
	
	self.cfLayer = [[UICoverFlowLayer alloc] initWithFrame:CGRectMake(0, 0, 320, 480) 
											numberOfCovers:12
									  numberOfPlaceholders:1];
	[[self layer] addSublayer:(CALayer *)self.cfLayer];
	
	self.phimg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
	[self.cfLayer setPlaceholderImage: [self.phimg layer] atPlaceholderIndex:0];
	
	unsigned int *pharray = malloc(count * sizeof(int));
	for (int i = 0; i < 12; i++) pharray[i] = 0;;
	[cfLayer setPlaceholderIndicesForCovers:pharray];
	[self setUserInteractionEnabled:YES];
	return self;
}   //init


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	[self.cfLayer dragFlow:0 atPoint:[[touches anyObject] locationInView:self]];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
	[self.cfLayer dragFlow:1 atPoint:[[touches anyObject] locationInView:self]];
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{	
	[self.cfLayer dragFlow:2 atPoint:[[touches anyObject] locationInView:self]];
}
- (void) flipSelectedCover         //翻转我们的cover
{
	[self.cfLayer flipSelectedCover];
}
//touch event
然后回到我们的 CoverFlowViewController


在ViewDidLoad方法里面我们加上这段代码
[self.view setUserInteractionEnabled:YES];
	 self.cfView = [[CoverFlowView alloc] initWithFrame:CGRectMake(0, 0, 320, 480) addCount:1];
	[self.cfView.cfLayer setDelegate:self];  // 设置代理
	[self.cfView.cfLayer selectCoverAtIndex:1];
	self.view = self.cfView;


#pragme datasource method

(void) coverFlow:(id)coverFlow requestImageAtIndex: (int)index quality: (int)quality
{
 UIImage *whichImg = [UIImage imageNamed:[NSString stringWithFormat:@"00%d.jpg",index]];
	[coverFlow setImage:[whichImg CGImage]  atIndex:index type:quality];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	[self.cfView flipSelectedCover];
}
OK 程序写到这里已经进行的差不多了。
让我们运行下看看效果如何?

很炫吧!!赶紧去实现你的CoverFlow吧 祝你学的开心!!:lol
分享到:
评论
13 楼 marshluca 2010-03-26  
joycodes 写道
写写玩玩还行,苹果是不会让包含私有api的程序上线运行的。。肯定被拒绝的。



已经有上线的app了。感谢楼主分享,正好需要。
12 楼 joycodes 2010-01-29  
写写玩玩还行,苹果是不会让包含私有api的程序上线运行的。。肯定被拒绝的。
11 楼 lovebirdegg 2010-01-19  
ext 写道
双击 这样的事件 怎么处理?
代码里只有touch Event

用UITouch *touch = [touches anyObject];获取UITouch对象,
UITouch又一个属性tapCount可以取得点击的次数
10 楼 ext 2010-01-19  
双击 这样的事件 怎么处理?
代码里只有touch Event
9 楼 huqing 2010-01-12  
C 呀 不懂
8 楼 lordhong 2010-01-12  
有个问题噢, 就是用private framework不能保证将来可以运行啊
7 楼 lovebirdegg 2010-01-08  
guying1028 写道
#pragme datasource method 
 
(void) coverFlow:(id)coverFlow requestImageAtIndex: (int)index quality: (int)quality 

UIImage *whichImg = [UIImage imageNamed:[NSString stringWithFormat:@"00%d.jpg",index]]; 
    [coverFlow setImage:[whichImg CGImage]  atIndex:index type:quality]; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

    [self.cfView flipSelectedCover]; 


楼主,这段代码是怎么实现的??
实现的哪个协议吗???



编译错误需要引入 QuartzCore.framework 并用import  QuartzCore.h

上边这段代码不需要实现什么协议的
6 楼 guying1028 2010-01-08  
#pragme datasource method 
 
(void) coverFlow:(id)coverFlow requestImageAtIndex: (int)index quality: (int)quality 

UIImage *whichImg = [UIImage imageNamed:[NSString stringWithFormat:@"00%d.jpg",index]]; 
    [coverFlow setImage:[whichImg CGImage]  atIndex:index type:quality]; 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 

    [self.cfView flipSelectedCover]; 


楼主,这段代码是怎么实现的??
实现的哪个协议吗???
5 楼 guying1028 2010-01-08  
error: request for member 'cfLayer' in something not a structure or union
error: request for member 'phimg' in something not a structure or union

编译出了这种错误
楼主帮解!




4 楼 moderating 2010-01-07  
效果很棒啊,我还以为这种效果是opengl写出来的,这几天正琢磨
3 楼 lovebirdegg 2010-01-07  
NumbCoder 写道
这是什么代码,object-c?

对,objective-c
2 楼 NumbCoder 2010-01-07  
这是什么代码,object-c?
1 楼 liuzongan 2010-01-06  
lovebirdegg 写道
原文地址:iPhone手把手教你做CoverFlow!!
http://www.aisidachina.com/forum/viewthread.php?tid=799
大家好,今天来给大家讲讲iPhone里面的CoverFlow技术。



      CoverFlow 并未加入的苹果的官方SDK,但是它仍然是标准的UIKit,因此我么可以提取出UICoverFlowLayer.h文件。那我们怎么生成CoverFlow效果呢?下面一步教你怎么实现简单的CoverFlow效果:首先建立一个View based Application。

名字随便起就行 这里我命名为CoverFlow如图:

接下来新建一个空文件,然后将 UICoverFlowLayer.h 里面的代码拷贝进去,
命名为 UICoverFlowLayer.h
UICoverFlowLayer.h
*/
@interface UICoverFlowLayer : NSObject // CALayer
{
    void *_private;
}

- (id)initWithFrame:(struct CGRect)fp8 numberOfCovers:(unsigned int)fp24 numberOfPlaceholders:(unsigned int)fp28;
- (unsigned int)numberOfCovers;
- (unsigned int)numberOfPlaceholders;
- (void)dealloc;
- (void)setDelegate:(id)fp8;
- (void)setPlaceholderImage:(void *)fp8 atPlaceholderIndex:(unsigned int)fp12;
- (void)setPlaceholderIndicesForCovers:(unsigned int *)fp8;
- (void)_prefetch:(unsigned int)fp8 atIndex:(unsigned int)fp12;
- (void)_requestBatch;
- (void)_requestImageAtIndex:(int)fp8 quality:(unsigned int)fp12;
- (void)_requestImageAtIndex:(int)fp8;
- (void)_notifySelectionDidChange;
- (void)transitionIn:(float)fp8;
- (void)transitionOut:(float)fp8;
- (void)transition:(unsigned int)fp8 withCoverFrame:(struct CGRect)fp12;
- (void)transitionIn:(float)fp8 fromFrame:(struct CGRect)fp12;
- (void)transitionOut:(float)fp8 toFrame:(struct CGRect)fp12;
- (void)setDisplayedOrientation:(int)fp8 animate:(BOOL)fp12;
- (void)setInfoLayer:(id)fp8;
- (void)setImage:(void *)fp8 atIndex:(unsigned int)fp12 type:(unsigned int)fp16;
- (void)setImage:(void *)fp8 atIndex:(unsigned int)fp12 type:(unsigned int)fp16 imageSubRect:(struct CGRect)fp20;
- (void)setImage:(void *)fp8 atIndex:(unsigned int)fp12;
- (unsigned int)indexOfSelectedCover;
- (unsigned int)_coverAtScreenPosition:(struct CGPoint)fp8;
- (void)_recycleLayer:(int)fp8 to:(int)fp12;
- (void)_setNewSelectedIndex:(int)fp8;
- (void)_updateTick;
- (void)displayTick;
- (void)dragFlow:(unsigned int)fp8 atPoint:(struct CGPoint)fp12;
- (void)selectCoverAtIndex:(unsigned int)fp8;
- (void)selectCoverAtOffset:(int)fp8;
- (unsigned int)coverIndexAtPosition:(float)fp8;
- (void)_setupFlippedCoverLayer:(id)fp8;
- (void)flipSelectedCover;
- (int)benchmarkTick;
- (void)benchmarkHeartbeatLongScrub;
- (void)benchmarkHeartbeatShortScrub;
- (void)benchmarkHeartbeatScrubAndWait;
- (void)benchmarkTightLoop;
- (void)benchmarkTightLoopScrub;
- (BOOL)benchmarkLoadScrub;
- (BOOL)benchmarkImageManager:(void *)fp8;
- (void)benchmarkSetEnv;
- (void)benchmarkMode:(int)fp8;
- (void)benchmarkTickMode:(int)fp8;
- (void)benchmarkImageMode:(int)fp8;
- (void)benchmarkPerformanceLog:(BOOL)fp8;
- (void)benchmarkTightLoopTime:(unsigned int)fp8;
- (void)benchmarkLongScrubSpeed:(float)fp8;
- (void)benchmarkSkipImageLoad:(BOOL)fp8;

@end
首先介绍一下CFLayer,iPhone开发过程中,我们直接控制的是UIView,而不是
Layer,UIView 相当于Layer的一个子类,因此我们要想显示我们的CoverFlowLayer,就必须
建立一个UIView,来充当我们Layer的容器。

新建一个UIView的子类,并选中also create .h
这里我命名为CoverFlowView 接下来我们将在CoverFlowView 里面初始化我们的Layer
- (CoverFlowView*)initWithFrame:(CGRect)aRect addCount:(NSInteger)count {
	self = [super initWithFrame:aRect];
	
	self.cfLayer = [[UICoverFlowLayer alloc] initWithFrame:CGRectMake(0, 0, 320, 480) 
											numberOfCovers:12
									  numberOfPlaceholders:1];
	[[self layer] addSublayer:(CALayer *)self.cfLayer];
	
	self.phimg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
	[self.cfLayer setPlaceholderImage: [self.phimg layer] atPlaceholderIndex:0];
	
	unsigned int *pharray = malloc(count * sizeof(int));
	for (int i = 0; i < 12; i++) pharray[i] = 0;;
	[cfLayer setPlaceholderIndicesForCovers:pharray];
	[self setUserInteractionEnabled:YES];
	return self;
}   //init


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	[self.cfLayer dragFlow:0 atPoint:[[touches anyObject] locationInView:self]];
}
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
	[self.cfLayer dragFlow:1 atPoint:[[touches anyObject] locationInView:self]];
}
- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{	
	[self.cfLayer dragFlow:2 atPoint:[[touches anyObject] locationInView:self]];
}
- (void) flipSelectedCover         //翻转我们的cover
{
	[self.cfLayer flipSelectedCover];
}
//touch event
然后回到我们的 CoverFlowViewController


在ViewDidLoad方法里面我们加上这段代码
[self.view setUserInteractionEnabled:YES];
	 self.cfView = [[CoverFlowView alloc] initWithFrame:CGRectMake(0, 0, 320, 480) addCount:1];
	[self.cfView.cfLayer setDelegate:self];  // 设置代理
	[self.cfView.cfLayer selectCoverAtIndex:1];
	self.view = self.cfView;


#pragme datasource method

(void) coverFlow:(id)coverFlow requestImageAtIndex: (int)index quality: (int)quality
{
 UIImage *whichImg = [UIImage imageNamed:[NSString stringWithFormat:@"00%d.jpg",index]];
	[coverFlow setImage:[whichImg CGImage]  atIndex:index type:quality];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	[self.cfView flipSelectedCover];
}
OK 程序写到这里已经进行的差不多了。
让我们运行下看看效果如何?

很炫吧!!赶紧去实现你的CoverFlow吧 祝你学的开心!!:lol

学习了,哥们,谢谢共享

相关推荐

    iPhone开发秘籍 Coverflow

    《iPhone开发秘籍:Coverflow》是一本专为iOS开发者准备的指南,主要聚焦于Coverflow这一独特的用户界面效果的实现。Coverflow是苹果公司在其iOS操作系统中引入的一种视觉效果,它模仿了翻阅专辑封面或图片的效果,...

    iphone coverflow效果演示代码

    【封面滚动(Coverflow)效果】是iOS平台上一种独特且引人注目的用户界面元素,常见于音乐播放器、照片库应用中,模仿了物理世界中物体在平面上翻转的效果。这种效果使得用户可以优雅地浏览和选择项目,增强了交互...

    iphone-CoverFlow

    iphone-coverflow,iphone-coverflow,iphone-coverflow,iphone-coverflow,iphone-coverflow,iphone-coverflow,iphone-coverflow,iphone-coverflow,iphone-coverflow

    android-coverflow

    在Android平台上,"android-coverflow" 是一个实现类似iPhone中Coverflow效果的库。Coverflow是一种视觉效果,它展示了一组元素(通常是图像)以旋转木马或翻页书的形式,用户可以滚动浏览,看起来就像元素在围绕一...

    CoverFlow 例子

    这个“CoverFlow 例子”提供的代码是为了帮助开发者在自己的iPhone应用中实现这种交互式的浏览体验。下面将详细介绍CoverFlow的概念、实现原理以及如何利用提供的代码进行集成。 CoverFlow的灵感来源于苹果公司的...

    android 实现Coverflow

    在Android平台上实现Coverflow效果,主要是为了模仿iPhone中经典的3D滚动图片浏览界面。这个"CoverFlow"效果在用户交互中提供了独特的视觉体验,让用户能够像翻阅实物书本一样浏览图片。以下是对这个Android项目的...

    iOS coverFlow源代码

    这个名为“iOS coverFlow源代码”的资源提供了实现这种效果的源代码,适用于iPhone应用开发。 CoverFlow的核心是通过自定义视图控件来创建,它通常继承自`UIScrollView`,因为`UIScrollView`已经内置了滚动和平移的...

    android实现Iphone的coverFlow图片浏览效果

    在Android平台上,实现类似iPhone的CoverFlow图片浏览效果可以借助于`Gallery`控件,这是一种在早期Android版本中常用来展示一系列图片或项的水平滚动视图。在本项目中,我们将探讨如何利用`Gallery`控件来创建一个...

    Cover flow (iPad) 代码分享

    Cover Flow是一种视觉效果,常用于显示一系列图像或项目,用户可以像翻阅书页一样浏览。这个技术最初由Apple引入,特别是在iPod中用来展示专辑封面。在iPad上,Cover Flow能够提供更丰富的用户体验,因为它拥有更大...

    Coverflow demo

    在iPhone应用开发中,Coverflow效果被广泛应用,因为它能够提供一种动态且吸引人的界面设计。 在"01a-Coverflow 2.2 Update"这个压缩包中,我们可以推测它包含的是一个Coverflow效果的更新版本2.2。通常,这种更新...

    手把手教您如何拆换iPhone 5电池教程

    手把手教您如何拆换iPhone5电池教程 高清!详细!

    (0113)-iOS/iPhone/iPAD/iPod源代码-滚动视图(ScrollView)-Cover Flow for iPhone

    在这个特定的项目"Cover Flow for iPhone"中,开发者利用滚动视图实现了类似于苹果iOS设备中经典的“Cover Flow”效果,这是一种3D视觉体验,让用户在浏览图像时有一种翻阅书页或滑动唱片封面的感觉。 "Cover Flow...

    iphone上实现可以循环显示的flow cover效果

    在iOS开发中,创建引人入胜的用户体验是至关重要的,而"iPhone上实现可以循环显示的Flow Cover效果"正是这种体验的一种体现。Flow Cover是一种动态的视图切换方式,它模仿了翻页或流体流动的效果,为用户提供了丰富...

    (0112)-iOS/iPhone/iPAD/iPod源代码-滚动视图(ScrollView)-Cover Flow

    在项目中,你需要导入UIKit框架,因为它包含了UIScrollView和其子类,如UIImageView,这些都是实现Cover Flow所必需的。 1. **设置UIScrollView** - 创建一个UIScrollView实例,并将其frame设置为视图的大小,以便...

    (0150)-iOS/iPhone/iPAD/iPod源代码-滚动视图(ScrollView)-iCarousel for Cover Flow

    Cover Flow coverflow time machine ----------------------------- 实现各种各样的cover flow效果。功能十分强大,实现了将近10种cover flow的效果。效果如图所见。用户手指划动图片...

    CoverFlow(iPhone源代码)

     类似Apple iTunes 音乐封面的cover flow效果。可以用持续滑动。 小编注:滑动过程太过“流畅”,不好控制选择的页面,希望能改进。感谢开发者@忆易1091_4y6 分享代码于Code4App。 Code4App编译测试,适用环境:...

    iPhone 开发UIcoverflow uiscrollview 3d 效果

    "iPhone 开发UIcoverflow uiscrollview 3d 效果"这个主题涉及到的是如何使用UIScrollView来实现一种类似Cover Flow的3D翻页效果,这是一种极具视觉吸引力的用户界面元素,常见于音乐播放器、图库应用等,让用户可以...

    iphone开发用的coverflower,很多很多的coverflower的效果哦~

    "iPhone开发用的CoverFlow"指的是在开发iOS应用时,使用特定的库或框架来实现CoverFlow效果。这个压缩包可能包含了多个版本或不同实现方式的CoverFlow效果,供开发者根据需求选择和使用。 在iOS开发中,实现Cover...

    原创 iphone 示例 教程

    【标题】:“原创 iPhone 示例教程” 本教程专为初次接触 iPhone 使用的新手设计,旨在提供一个详尽且易懂的学习路径,帮助用户快速掌握 iPhone 的基本操作和实用技巧。通过一系列精心编排的教学材料,您将能够从零...

    iphone 上的循环flow程序

    "Coverflow"这个名字来源于其视觉效果与苹果的Cover Flow特性相似,该特性最初出现在Finder中,后来被广泛应用于iPod和iPhone的音乐应用。 在iPhone上的循环Flow程序,开发者通常会利用Core Animation框架中的...

Global site tag (gtag.js) - Google Analytics