UIImageView+GestureRecognizer
来源:互联网 发布:南沙人工智能产业园 编辑:程序博客网 时间:2024/05/20 14:18
第五讲: 设计模式,手势识别器 本讲内容
一. Target/action设计模式
耦合: 耦合是衡量模块与模块之间关联程度的指标, 它是衡量一个程序写的好坏的标准之一
“高内聚,低耦合”是面向对象编程的核心思想
// 试想 系统点击方法touches实现点击事件的劣(lie, 四声)势
每个视图的点击事件都不一样,如何处理?
我们无法预先知道这个视图点击之后都要实现什么效果
因此我们在类内部提前写好点击事件不科学也不全面
// 使用Target/action实现解耦
二. 代理设计模式
Delegate模式: 当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,又不明确谁来实现这些功能的时候,委托模式就可以派上用场, 其目的是为了降低类之间的耦合性
//如何用Delegate实现解耦
delegate也是用来解耦的,它不再简简单单让目标去执行一个动
作了, 而是delegate去处理一系列事件、就像UITextFieldDelegate一样,能监测将要开始编辑,已经开始编辑、return按钮点击等等
Delegate使用场景
控件有一系列时间点,控制器可以实现这个代理方法,以便在适当
的时机做适当的事
三. UIImageView
UIImageView是iOS中用于显示图片的类,iOS中几乎所有看到的 图片,都是由这个类来显示的
四. 手势识别器
手势识别器是对触摸事件做了封装,我们无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用,我们把重心放在识别之后要做什么操作上面, 它是iOS中比较抽象的一个类,共有七个子类
一旦指定的手势被识别, 我们可以执行我们自己定义好的操作
如何使用识别器
我们不会直接使用手势识别器这个抽象父类,而是根据需要使用特定的手势识别器创建对象
1、创建UIxxxGestureRecognizer对象,使用initWithTarget:action:方法
2、配置要识别的手势的相关信息
3、将手势添加到某个视图上
4、实现手势识别器里定义的方法
view的transform属性
transform是view的一个重要属性,它在矩阵层面上改变view的显示状态,能实现view的缩放、旋转、平移等等功能
#import "MainViewController.h"@interface MainViewController ()@property(nonatomic, retain)UIImageView *imageView;@property(nonatomic, retain)UIAlertView *alertView;@end@implementation MainViewController- (void)dealloc{// [self.view release]; self.view作为系统给出视图 不需要我们释放 我们只需要管我们创建的东西 即程序中看得见的retain || alloc [self.imageView release]; [self.alertView release]; [super dealloc];}- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor brownColor]; // UIImageView // UIImage *image1 = [[UIImage alloc] initWithContentsOfFile:@"scratch.png"]; // 这方法怎么用? UIImage *image = [UIImage imageNamed:@"scratch.png"]; self.imageView = [[UIImageView alloc] initWithImage:image]; self.imageView.frame = CGRectMake(130, 200, 120, 200); self.imageView.backgroundColor = [UIColor yellowColor]; [self.view addSubview:self.imageView]; [self.imageView release]; // 把图片的用户交互打开,它默认是关闭的,此外还有一个控件是label self.imageView.userInteractionEnabled = YES; // 图片大小适应imageView.frame的大小 UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"28.jpg"]]; [self.view addSubview:iv]; [iv release]; // 调用initWithImage:方法,它创建出来的imageview的宽高和图片的宽高一样 UIImageView *im = [[UIImageView alloc] initWithFrame:self.view.bounds]; im.image = [UIImage imageNamed:@"28.jpg"]; [self.view addSubview:im]; [im release]; // 这种初始化方法怎么用? UIImageView *iw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"13.jpg"] highlightedImage:[UIImage imageNamed:@"28.jpg"]]; [scrollView addSubview:iw]; scrollView.contentSize = [UIImage imageNamed:@"13.jpg"].size; [iw release]; iw.tag = 500; // 取网络图片的方法 UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://fdfs.xmcdn.com/group16/M00/66/92/wKgDbFXgRVHx7qhRAAGp5e22Sas297_ios_large.jpg"]]]; iw.image = image; // UIImageView 高亮图 UIImageView *headshotImageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"image1.jpg"] highlightedImage:[UIImage imageNamed:@"image2.jpg"]]; headshotImageView.frame = CGRectMake(25, 10, 100, 100); headshotImageView.userInteractionEnabled = YES; // 打开这个 headshotImageView.tag = 888; [self.view addSubview:headshotImageView]; [headshotImageView release];// UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)];// [headshotImageView addGestureRecognizer:singleTap];// [singleTap release]; //让一个UIImageView响应点击事件 UIImageView *imgView =[[UIImageView alloc] initWithFrame:CGRectMake(0, 0,320, 44)]; imgView.userInteractionEnabled=YES; UITapGestureRecognizer *singleTap =[[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(onClickImage)]; [imgView addGestureRecognizer:singleTap]; [singleTap release]; // 手势的使用 // 1.点击 UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; // 设置点击几次才会触发方法 tap.numberOfTapsRequired = 2; // 设置几个手指进行点击 tap.numberOfTouchesRequired = 2; // 将手势添加到对应的图片上 [self.imageView addGestureRecognizer:tap]; [tap release]; // 2.长按 UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressAction:)]; // 设置长按按钮触发的最短时间 longPress.minimumPressDuration = 1; // 用户手指在长按过程中允许移动的距离 longPress.allowableMovement = 50; // 指的是点按中方法实现之前的那段时间,看移动距离是否超出范围,是则不执行方法,否则继续执行 // 把手势添加到图片上 [self.view addGestureRecognizer:longPress]; [longPress release]; // 3.旋转 // 创建一个旋转的手势 UIRotationGestureRecognizer *Rotation = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotationAction:)]; // 把手势放到对应的图片上 [self.imageView addGestureRecognizer:Rotation]; [Rotation release]; // 4.捏合 UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinchAction:)]; [self.imageView addGestureRecognizer:pinch]; [pinch release]; // 5.拖拽 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panAction:)]; [self.imageView addGestureRecognizer:pan]; [pan release]; // 6.轻扫 // 怎么触摸 很难按出来. UISwipeGestureRecognizer *swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeAction:)]; [self.imageView addGestureRecognizer:swipe]; [swipe release]; // 轻扫方向 swipe.direction = UISwipeGestureRecognizerDirectionRight; // 7.屏幕边际方法// UIScreenEdgePanGestureRecognizer // 自行查找 // UIStepper *stepper = [[UIStepper alloc] initWithFrame:CGRectMake(0, 0, 20, 20)]; stepper.backgroundColor = [UIColor whiteColor]; [stepper addTarget:self action:@selector(stepperAction:) forControlEvents:UIControlEventValueChanged]; [stepper setMinimumValue:0]; //</span> [stepper setMaximumValue:100]; stepper.stepValue = 80; //每次递增</span> [stepper setWraps:YES]; [stepper setContinuous:YES]; [self.imageView addSubview:stepper];// autorepeat: 控制是否在按住时自动持续递增或递减,默认YES; [stepper release];}// 自定义的点击方法//- (void)handleSingleTap:(UITapGestureRecognizer *)tap//{// UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:888];// headshotImageView.highlighted = !headshotImageView.highlighted;// NSLog(@"单手点击方法");//}- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:888]; headshotImageView.highlighted = YES; NSLog(@"点击开始");}- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{ UIImageView *headshotImageView = (UIImageView *)[self.view viewWithTag:888]; headshotImageView.highlighted = NO; NSLog(@"点击结束");}-(void)onClickImage{ // here, do whatever you wantto do NSLog(@"imageview is clicked!");}- (void)stepperAction:(UIStepper *)stepper{ // 此控件这么使用对于imageView没什么用? 因为点击该控件只能修改一次视图大小 int temp = stepper.value; self.imageView.bounds = CGRectMake(temp, temp, temp, temp);}#pragma mark 清扫的方法:- (void)swipeAction:(UISwipeGestureRecognizer *)swipe{ if (swipe.direction == UISwipeGestureRecognizerDirectionRight) { NSLog(@"向右"); } self.imageView = (UIImageView *)swipe.view;}#pragma mark 拖拽的方法:通过拖拽手势,让视图随着手势的移动而移动- (void)panAction:(UIPanGestureRecognizer *)pan{ // 通过手势找视图 self.imageView = (UIImageView *)pan.view; // 通过手势获得经过的店 CGPoint p = [pan translationInView:self.imageView]; // 设置移动的位置 self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, p.x, p.y); // 为了防止手势在操作的时候视图消失 [pan setTranslation:CGPointZero inView:self.imageView];// self.imageView.transform =}#pragma mark 捏合的方法:通过捏合手势,缩放图片- (void)pinchAction:(UIPinchGestureRecognizer *)pinch{ // 通过手势找视图 self.imageView = (UIImageView *)pinch.view; // 通过transform改变图片的尺寸 self.imageView.transform = CGAffineTransformScale(self.imageView.transform, pinch.scale, pinch.scale); pinch.scale = 1;}#pragma mark 旋转的方法:通过图片的旋转手势,让图片发生旋转- (void)rotationAction:(UIRotationGestureRecognizer *)Rotation{ // 可以通过手势获取手势添加的视图是哪一个 self.imageView = (UIImageView *)Rotation.view; // 进行旋转的操作 // 通过视图的transform属性,让视图进行旋转// self.imageView.transform = CGAffineTransformMakeRotation(Rotation.rotation); self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, Rotation.rotation); Rotation.rotation = 0; NSLog(@"测试旋转");}#pragma mark 长按的方法- (void)longPressAction:(UILongPressGestureRecognizer *)longPress{ // 长按的状态// longPress.state // 长按之后弹出一个alertView if (self.alertView == nil) { // 与!self.alertView同样 self.alertView = [[UIAlertView alloc] initWithTitle:@"老婆" message:@"让我亲一个吧!" delegate:self cancelButtonTitle:@"拒绝" otherButtonTitles:@"木马~", nil]; [self.alertView release]; } NSLog(@"pia"); // 只要长按每次都打印两遍 [self.alertView show];}#pragma mark 点击的方法- (void)tapAction:(UITapGestureRecognizer *)tap{ NSLog(@"测试一下点击手势"); self.imageView.image = [UIImage imageNamed:@"image1.jpg"];}
- UIImageView+GestureRecognizer
- gestureRecognizer
- gestureRecognizer
- GestureRecognizer
- GestureRecognizer
- 9.3 GestureRecognizer
- GestureRecognizer手势
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- UIImageView
- Bit Manipulation - Power of Two
- hdu2037
- 图的点连通度边连通度总结
- prim算法模版 hdu 1875
- UI05 _ 分段控件 -- UISegmentedControl
- UIImageView+GestureRecognizer
- Count Complete Tree Nodes(****)
- 一个ViewController里有三个TableView,分别为省市区,逐级跳转
- php 源码安装没有gd库
- 使用java.nio及其子包中的类SocketChanel完成如下功能:读取www.baidu.com等网页的内容,打印到控制台,避免中文乱码问题。
- Aragorn's Story - HDU 3966 树链刨分
- TCP通讯程序设计
- 二进制地址的伙伴地址
- vim配色方案