触摸
UIView不接收触摸事件的三种情况
- 不接收用户交互
- userInteractionEnableed = NO;
- 隐藏
- hidden = YES;
- 透明
- alpha = 0.0~0.01
- 不接收用户交互
提示:UIImageView的userInteractionEnableed默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的。
- 如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸时间
手势
UIGestureRecognizer是一个抽象类,定义了所有手势的基本行为,使用它的子类才能处理具体的手势
UITapGestureRecognizer(敲击)
可以通过number…属性调整触发事件的点击次数
UIPinchGestureRecognizer(捏合,用于缩放)
scale缩放比例。比例是相对于最开始。注意清零
UIPanGestureRecognizer(拖拽)
注意清零。[pan translationInView:self.imageView]获取的是手指移动了多少。
[pan locatonInView:]获取的是手势的触摸点
UISwipeGestureRecognizer(轻扫)
默认向右滑,可以通过direction属性修改触发事件的滑动方向。如果想要一个控件支持多个方向的轻扫,必须创建多个清扫手势,一个轻扫手势只支持一个方向。
UIRotationGestureRecognizer(旋转)
注意复位问题。totation属性控制角度。旋转角度是相对于最原始状态。注意清零
UILongPressGestureRecognizer(长按)
默认会触发两次,按下一次,手指抬起一次,一般会判断一下状态,把手势传到需要调用的方法里。手势.state=UIGestureRecognizerState…表示状态
默认情况下只允许一个手势在执行,如果要同时触发多个手势,需要把shouldRecognizeSimultaneouslyWithGestureRecognizer代理方法的返回值设为YES,需要设置允许同时的那俩手势的delegate为self
自动提示宏
宏的操作原理,每输入一个字母就会直接把宏右边的拷贝,并且会自动补齐前面的内容
宏里面的#,会自动把后面的参数变成c语言的字符串
逗号表达式,只取右边的值
- 什么情况下需要用到自动提示宏
例如
[_mainView addObserver:self forKeyPath:_mainView.frame options:NSKeyValueObservingOptionNew context:nil];
但是里面是不能用_mainView.frame的 - 宏的操作原理,每输入一个字母就会直接把宏右边的拷贝,并且会自动补齐前面的内容
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))
- 宏里面的#,会自动把后面的参数变成C语言的字符串
NSLog(@"%s",keyPath(_mainView, frame));
打印结果:frame
NSLog(@"%@", [keyPath(_mainView, frame) class]);
打印结果:NSTaggedPointerString
- 如何把c语言字符串转OC字符串
char *c = "act";
nslog(@"%@",@(c));
[_mainView addObserver:self forKeyPath:keyPath(_mainView, frame) options:NSKeyValueObservingOptionNew context:nil];