分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
因为种种原因,需要在iphone应用中实现图片查看功能,由于iphone屏幕支持多点触摸,于是是想到用“手势”来实现图片的实时缩放和移动。借鉴无所不在的internet网络资料之后,终于实现此一功能,过程如下。
为方便大家下载,示例代码已上传到资源:http://download.csdn.net/detail/kmyhy/4095890
一、 首先实现原图显示(不缩放)
新建MoveScaleImageView类,继承uiview。用于加载一个UIImage。它有两个主要的成员,一个UIImage对象用于指定一个内存图片,一个UIImageView控件用于显示图片。
@interface MoveScaleImageView :UIView {
UIImage* originImage;
UIImageView* imageView;
}
-(void)setImage:(UIImage*)_image;
@end
@implementation MoveScaleImageView
-(id)initWithFrame:(CGRect)frame{
if (self=[super initWithFrame:frame]) {
imageView=[[UIImageView alloc]init];
[self addSubview:imageView];
// 使图片视图支持交互和多点触摸
[imageView setUserInteractionEnabled:YES];
[imageView setMultipleTouchEnabled:YES];
}
return self;
}
-(void)dealloc{
originImage=nil;
imageView=nil;
[super dealloc];
}
-(void)setImage:(UIImage *)_image{
originImage=[[UIImage alloc]initWithCGImage:_image.CGImage];
[imageView setImage:originImage];
[imageView setFrame:CGRectMake(0, 0, _image.size.width, _image.size.height)];
// [imageView setNeedsLayout];
}
@end
最主要的就是setImage方法。
MoveScaleImageView的使用很简单。在ViewController中构造一个MoveScaleImageView,然后用一个加载了图片文件的UIImage对象设置其image成员:
UIImage* image=[UIImage imageNamed:@"df.jpg"];
MoveScaleImageView* [[MoveScaleImageView alloc]initWithFrame:
CGRectMake(0, 44, 320, 436)];
[fileContent setImage:image];
由于在这里我们没有对图片进行任何的缩放处理,对于小图片会位于屏幕的左上角,并在其他地方留下空白;对于尺寸大于屏幕的图片,则图片不能完全显示:
一、 识别手势(单点触摸与多点触摸)
要想识别手势(gesture),必须响应4个手势的通知方法(参考“iphone3开发基础教程”第13章的内容):
touchesBegan,touchesMoved,touchesEnded和touchesCancelled。
首先,我们先来考虑单点触摸情况,这比较简单一些。在单点触摸情况下,移动手指,imageView中的图片可以被拖动,这样,对于比较大的图片,我们可以通过拖动来浏览图片的各个部分,当然,对于能一次显示下全部的图片就不需要拖动了。
修改类MoveScaleImageView,在.h中增加一些声明:
@interface MoveScaleImageView :UIView {
UIImage* originImage;
UIImageView* imageView;
CGPoint gestureStartPoint;//手势开始时起点
CGFloat offsetX,offsetY;//移动时x,y方向上的偏移量
CGFloat curr_X,curr_Y;//现在截取的图片内容的原点坐标
}
-(void)setImage:(UIImage*)_image;
-(void)moveToX:(CGFloat)x ToY:(CGFloat)y;
@end
然后实现touchesBegan和touchesMoved方法。
touchesBegan方法比较简单,记录下手指第一次触摸的位置。因为任何一个拖动都必然有一个起点和终点。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch *touch=[touches anyObject];
gestureStartPoint=[touch locationInView:self];
// NSLog(@"touch:%f,%f",gestureStartPoint.x,gestureStartPoint.y);
}
然后是手指移动后回调的touchesMoved方法:
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
UITouch* touch=[touches anyObject];
CGPoint curr_point=[touch locationInView:self