UI 第五天 代理设计模式 手势识别器

一. target/action设计模式
target/action 设计模式是类似于button的设置方法一样,可以让view,imageView等实现类似button的点击方法, 还有主要为了 “解耦”,耦合是衡量一个程序写的好坏的标准之一,也是衡量模块与模块之间关联程度的指标. “高内聚,低耦合”是面向对象编程的核心思想. 另一方面也是因为touch的局限性,虽然view可以通过touch方法触发事件,但是这样点击时间不科学也不全面.
target/action 核心思想: 需要让目标去执行一个动作的地方

二.delegate模式
当一个类的某些功能需要被别人来实现,但是既不明确是些什么功能,右不明确谁来实现这些功能的时候,委托模式就可以派上用场.
目的: 为了降低类之间的耦合性.
步骤: 1.创建一个协议,不过不是创一个协议的文件,而是在你在你新建的视图类里面 @protocol ButtonImageViewDelegate
2.设置代理方法 (捕获点击事件)
- (void)buttonImageViewClick:(ButtonImageView *)buttonView;

3.设置代理人
@property(nonatomic,assign)iddelegate
添加代理属性这边有个问题 : 为什么要声明成assign?
结论:防止循环引用 从而造成内存泄漏
例如 A是B的代理 B也是A的代理 结果是retain
[[A alloc]init]; 计数 1
[[B alloc]init]; 计数 1
A.delegate = B; B:2
B.delegate = A; A:2
[A release]; A:1
[B release]; B: 1
这时 A B 都释放不掉 造成内存泄漏
这边还有一个问题, 方法在声明上面, 需要一个@class来解决这个问题
4. 让代理取干活 让代理取调用代理方法
在touchEnd 里面调用协议中的方法 这边需要做一个代理保护,看这个类有没有实现方法
if ([_delegate respondsToSelector:@selector(buttonImageViewClick:)]) {
[_delegate buttonImageViewClick:self];
}
5.在控制器中设置代理人,实现代理方法
不要忘了在控制器中添加协议,UIImageView 一定要开交互

三.手势识别器 UIGestureRecognizer,抽象类
1.轻拍 tap
2.长按 longPress
3.旋转 roration
4.捏合 pinch
5.平移 pan
6.轻扫 swipe(左扫,右扫)需要设置左右扫的方向
7.屏幕边缘扫 ScreenEdgePan 继承平移 同样需要设置 从屏幕哪个边缘扫
这7个手势都是可以添加响应方法的.

有一个重要的属性,取出被添加视图 例:tag.view
长按需要判断一个状态 长按只需要触发一次
旋转 需要形变属性 oration.view.transform = CGAffineTransformRotate(roration.view.transform, roration.rotation); 参数一 要改变形变属性的视图 参数二 根据弧度去创建 每次转需要把旋转的角度重置为0 因为要接替上一次的角度 开始旋转

捏合: pinch.view.transform = CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale); 根据缩放的刻度(比例)改变形变属性 根据手势捏合的比例 去改变形变属性 同样需要重置捏合比例. pinch.scale = 1;

平移: 获取平移的点(相当于要平移的视图) CGPoint p = [pan translationInView:pan.view]; 根据这个点改变形变属性 pan.view.transform = CGAffineTransformTranslate(pan.view.transform, p.x, p.y);
重置这个点 setTranslation:CGpoint inView: view

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值