UI_05 设计模式、?势识别器

?、target/action设计模式

耦合

耦合是衡量?个程序写的好坏的标准之?, 是衡量模块与模块之间关联程度的指标。 “?内聚,低耦合”是?向对象编程的核?思想。

使?target…action实现解耦

touchView.h:

@interface TouchView : UIView

@property (nonatomic, retain) id target;
@property (nonatomic, assign) SEL action;

- (instancetype)initWithTarget:(id)target action:(SEL)action;

@end

touchView.m

- (instancetype)initWithTarget:(id)target action:(SEL)action
{
    self = [super init];
    if (self) {
        self.target = target;
        self.action = action;
    }
    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@"clicked");
    [self.target performSelector:self.action withObject:self];

}

RootViewController.h

#import "RootViewController.h"

#import "TouchView.h"
#import "UIColor+RandomColor.h"

@interface RootViewController ()
@property (nonatomic, retain) TouchView *aTouchView;
@end

@implementation RootViewController

- (void)dealloc
{
    [_aTouchView release];
    [super dealloc];
}

- (void)viewDidLoad {
    [super viewDidLoad];

self.aTouchView = [[TouchView alloc] initWithTarget:self action:@selector(changeColor:)];

//changeColor:方法的参数为TouchView.m中performSelector: withObject:方法的obj

//[_target performSelector:sel withObject:obj];

//一个Target-Action在一个时间只能做一个事件

self.aTouchView.frame = CGRectMake(100, 100, 200, 200);
    self.aTouchView.backgroundColor = [UIColor redColor];

[self.view addSubview:_aTouchView];
    [self.aTouchView release];

self.view.backgroundColor = [UIColor blueColor];
}

- (void)changeColor:(TouchView *)view
{
    view.backgroundColor = [UIColor randomColor];

}

@end



?、代理设计模式

delegate也是?来解耦的,它不再简简单单让?标去执??个动 作了,?是delegate去处理?些列事件、就像UITextFieldDelegate? 样,能监测将要开始编辑,已经开始编辑、return按钮点击等等。

通过使用代理设计模式,实现开始点击自定义视图touchView时变换颜色,结束点击时变换位置

TouchViewDelegate.h

#import <Foundation/Foundation.h>
@class TouchView;
//#import "TouchView.h"
@protocol TouchViewDelegate <NSObject>

@optional

- (void)touchViewTouchBegan:(TouchView *)touchView;     //做饭

- (void)touchViewTouchMoved:(TouchView *)touchView;

- (void)touchViewTouchEnd:(TouchView *)touchView;

- (void)touchViewTouchCancel:(TouchView *)touchView;

@end

touchView.h

@interface TouchView : UIView

@property (nonatomic, assign) id<TouchViewDelegate> delegate;  //保姆

@end

toucheView.m

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

{

#pragma mark -- Delegate --

if ([self.delegate respondsToSelector:@selector(touchViewTouchBegan:)]) {
        [self.delegate touchViewTouchBegan:self];
    }
    if ([self.delegate respondsToSelector:@selector(touchViewTouchEnd:)]) {
        [self.delegate touchViewTouchEnd:self];

}

}

RootViewController.m

#import "RootViewController.h"
#import "TouchView.h"

@interface RootViewController ()
{
    TouchView *_touchView1;
    TouchView *_touchView2;
}
@end

@implementation RootViewController

- (void)viewDidLoad {
    [super viewDidLoad];
   
    _touchView1 = [[TouchView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    _touchView1.backgroundColor = [UIColor blueColor];

#pragma mark -- Delegate --
    //设置代理

_touchView1.delegate = self;

[self.view addSubview:_touchView1];
    [_touchView1 release];

}

#pragma mark -- Delegate --

- (void)touchViewTouchBegan:(TouchView *)touchView     //做饭

{

touchView.backgroundColor = [UIColor colorWithRed:arc4random() %256 / 255.0 green:arc4random() %256 / 255.0 blue:arc4random() %256 / 255.0 alpha:arc4random() %100 / 100.0];;

}

- (void)touchViewTouchEnd:(TouchView *)touchView
{
    touchView.center = CGPointMake(50, 50);

}

@end

利用家庭-保姆来理解:

TouchView:     家庭类

ContainerViewController:保姆类

TouchViewDelegate:      协议



三、UIImageView

UIImageView是iOS中?于显?图?的类,iOS中?乎所有看到的 图?,都是由这个类来显?的。

下面用UIImageView分别演示如何添加静态和动态图片

注:以下代码写在RootViewController.m

#import "RootViewController.h"
#import "UIColor+RandomColor.h"

@interface RootViewController ()
@property (nonatomic,retain) UIImageView *imgView;

@end

@implementation RootViewController

- (void)dealloc
{
    [_imgView release];

[super dealloc];

}

- (void)viewDidLoad {
    [super viewDidLoad];

#pragma mark -- UImageView --

self.imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1.png"]];

// 如果设置_imgView.frame,则图片大小为frame大小,发生形变。若不设置,则frame的大小为图片的大小
//    _imgView.frame = CGRectMake(0, 0, 371, 600);
    NSLog(@"%.f %.f", _imgView.frame.size.width, _imgView.frame.size.height);
    [self.view addSubview:_imgView];

[_imgView release];

#pragma mark -- 使用UIImageView播放动画图片gif --
    UIImageView * animationImage = [[UIImageView alloc] init];
    animationImage.frame = CGRectMake(100, 350, 150, 150);
   
    NSMutableArray * imagesArr = [NSMutableArray array];
    for (int i = 1; i<4; i++) {
        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"tu%d.tiff", i]];
        [imagesArr addObject:image];
    }
   
    animationImage.animationImages = imagesArr;
    animationImage.animationDuration = 0.1;
    [animationImage startAnimating];
//    [animationImage stopAnimating];
   
    [self.view addSubview:animationImage];

[animationImage release];

}

...

@end



四、?势识别器

?势识别器是对触摸事件做了封装,我们?需??去判断某个?势 是否触发,?势识别器本?起到了识别作?,我们把重?放在识别之 后要做什么操作上?。

?势识别器有7个?类,?旦指定的?势被识别,我们可以执?我们??定义好的操作。

  • 轻拍?势:UITapGestureRecognizer
  • 平移?势:UIPanGestureRecognizer
  • 轻扫?势: UISwipeGestureRecognizer
  • 捏合?势:UIPinchGestureRecognizer
  • 旋转?势:UIRotationGestureRecognizer
  • ?按?势:UILongPressGestureRecognizer
  • 屏幕边界平移?势: UIScreenEdgePanGestureRecognizer(iOS7+)

RootViewController.m

@interface RootViewController ()
@property (nonatomic,retain) UIImageView *imgView;
@property (nonatomic, retain) UIView *tapView;
@end

@implementation RootViewController

- (void)dealloc
{
    [_imgView release];
    [_tapView release];
    [super dealloc];

}

- (void)viewDidLoad {

[super viewDidLoad];

#pragma mark -- UIGestureRecognizer --
    UIView * tapView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    tapView.backgroundColor = [UIColor grayColor];
    self.tapView = tapView;
    [self.view addSubview:tapView];
    [tapView release];
    //轻拍手势
    UITapGestureRecognizer * tapGR = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOnce:)];
    //添加手势
    [self.tapView addGestureRecognizer:tapGR];
    [tapGR release];
   
    //长按手势
    UILongPressGestureRecognizer * longGR = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
    [self.tapView addGestureRecognizer:longGR];
    [longGR release];
   
    //平移手势
    UIPanGestureRecognizer * panGR = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    [self.tapView addGestureRecognizer:panGR];
   
//    [animationImage addGestureRecognizer:panGR];
    [panGR release];
   
    //捏合手势
    UIPinchGestureRecognizer * pinchGR = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(pinch:)];
    [self.tapView addGestureRecognizer:pinchGR];
    [pinchGR release];
   
    //旋转
    UIView * aView = [[UIView alloc] initWithFrame:CGRectMake(0, 100, 100, 100)];
    aView.backgroundColor = [UIColor brownColor];
    [self.view addSubview:aView];
    [aView release];
    UIRotationGestureRecognizer * rotationGR = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotation:)];
    [aView addGestureRecognizer:rotationGR];
    [rotationGR release];

//轻扫

//    UISwipeGestureRecognizer
   
    //屏幕边界平移手势

//    UIScreenEdgePanGestureRecognizer

}

- (void)tapOnce:(UITapGestureRecognizer *)GR
{
//    self.tapView.hidden = YES;
//    self.tapView.backgroundColor = [UIColor randomColor];
    NSLog(@"");
}

- (void)longPress:(UILongPressGestureRecognizer *)GR
{
    GR.view.backgroundColor = [UIColor randomColor];
}

- (void)pan:(UIPanGestureRecognizer *)GR
{
   
    CGPoint translation = [GR translationInView:GR.view];
    NSLog(@"%@", NSStringFromCGPoint(translation));
    CGPoint center = GR.view.center;
    center.x += translation.x;
    center.y += translation.y;
    GR.view.center = center;
   
    [GR setTranslation:CGPointMake(0, 0) inView:GR.view];

}

- (void)pinch:(UIPinchGestureRecognizer *)GR
{
   
    GR.view.transform = CGAffineTransformScale(GR.view.transform, GR.scale, GR.scale);
    GR.scale = 1;
   
}

- (void)rotation:(UIRotationGestureRecognizer *)GR
{
    //第二个参数是弧度
    //180度 3.1415926 M_PI
    GR.view.transform = CGAffineTransformRotate(GR.view.transform, GR.rotation);
    GR.rotation = 0;

}

...

@end

transform是view的?个重要属性,它在矩阵层?上改变view的显? 状态,能实现view的缩放、旋转、平移等等功能。

时间: 08-20

UI_05 设计模式、?势识别器的相关文章

第五讲 设计模式 手势识别器

一.target/action设计模式 二.代理设计模式(delegate模式) delegate代理模式实现的步骤: 1.建立protocol协议文件,在其中声明想要执行的动作或事件 2.将协议引入要通过代理去实现的文件(在.h文件声明,在.m文件写需要通过代理去完成的事件) 3.让代理人(及代理别人执行文件的一方)遵守协议(.m文件),并实现相应的代理事件 实例代码: 练习:通过代理让自定义视图控制器帮助changeview(其是rootview子视图)完成变换颜色事件 Appdelegat

UI-target...action设计模式,手势识别器.UIimageview

target-action设计模式 iOS设计模式之Target-Action主要是为了降低代码的耦合性.顾名思义      Target-Action模式就是指  目标-动作模式,它贯穿于iOS开发始终. 提到Target-Action,先说2个词     “高内聚,低耦合”      这主要是评价一个软件的好坏 它评判软件的好坏主要靠模板之间内聚是否高,模块间耦合度是否低. 其实Target-action模式很简单,就是当某个事件发生时,调用那个对象中的那个方法.比如:点击按钮时,调用Con

UI基础:target...action设计模式,手势识别器.UIimageview

使用target..action和delegate设计模式可以实现解耦.使代码更加优化. 手势识别器: 手势识别器:是对触摸事件做了封装,无需自己去判断某个手势是否触发,手势识别器本身起到了识别作用,所在我们可以把重心放在识别之后该去做什么操作上面.很方便. 手势识别器是iOS中比较抽象的一个类,用于识别一个手势,所谓的手势:有规律的触摸. 手势识别器有7个子类: 分别是:轻怕手势,轻移手势,清扫手势,缩放手势,旋转手势,长按手势,以及屏幕边缘平移手势. 一旦指定的手势别识别了,就可以执行自定义

UI开发----target/action设计模式和代理设计模式以及手势识别器

//  Created By 郭仔  2015年04月16日21:50:33 眼睛有点痛,视力也在急速下降,心灵之窗,注意保护! ================================================ 耦合是衡量?一个程序写的好坏的标准之?一, 耦合是衡量模块与模块之间关联程度的指标 "?高内聚,低耦合"是?面向对象编程的核⼼心思想: ================ 设计模式思想很重要的 ================== target/action设计模

009-手势触摸事件处理

问题一:iOS中有哪些事件? •在用户使用app过程中,会产生各种各样的事件 •iOS中的事件可以分为3大类型 问题二:什么叫响应者对象? •在iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象” •UIApplication.UIViewController.UIView都继承自UIResponder,因此它们都是响应者对象,都能够接收并处理事件 问题三:UIResponder内部提供了哪些处理事件的方法来处理事件? •UIRes

【读书】JavaScript 设计模式与开发实践

2016.08.30 <JavaScript 设计模式与开发实践> 曾探 人民邮电出版社 2016年5月第1版 p13 找到变化的部分并封装之,以使得容易替换:而剩下的就是不变的部分. P49 函数柯里化(currying)的作用是多次收集参数,然后作为数组传给处理函数再一次执行. 其意义在于预处理--将预处理的流程放到一个函数里会更为清晰可控. P57 惰性加载函数 在函数内部重写引用函数的外部变量的引用,从而在第一次"调用"此变量后,此变量就指向新的正确的函数. p84

进击的UI---------------target/action设计模式&amp;Delegate&amp;手势识别

1.target/action设计模式: AppDelegate.m RootViewController.m ClickView.h ClickView.m ColorView.h ColorView.m RootView.h RootView.m ButtonView.h ButtonView.m 2.delegate设计模式(代理): AppDelegate.m RootViewController.m RootView.h: RootView.m: colorView.h colorVi

Java设计模式——创建型模式之单例模式

一.概述 作为第一个出场的设计模式,有必要先介绍一下设计模式(引用自百度百科): 设计模式(Design Pattern)是一套被反复使用.多数人知晓的.经过分类的.代码设计经验的总结. 使用设计模式的目的:为了代码可重用性.让代码更容易被他人理解.保证代码可靠性. 设计模式使代码编写真正工程化:设计模式是软件工程的基石脉络,如同大厦的结构一样. 设计模式概念的介绍,参见:http://blog.jobbole.com/101076/ 其中涉及的设计原则的概念,参见随笔:http://www.c

10大APP界面框架设计模式详解

随着移动互联网的发展,移动app已经成为了每个互联网公司的标配了,那作为产品经理,我们如何设计出更加符合用户体验的app产品呢?今天和大家分享的就是10中最常见的app界面光甲设计模式,一起来看看吧. 1.标签导航 标签导航是十大界面框架设计里最常用的界面框架设计,也是被业界之内公认的一种普遍使用的页面框架设计.那么这种页面框架设计在作业方面对一个用户来说也是最常见的一种页面框架设计,比如说微博.微信.手机百度.支付宝.淘宝,这些我们所谓的超级APP都是运用的标签导航,无一例外.从这个角度也可以