控制器的切换方式——Modal
- 任何控制器都能通过Modal的形式展示出来
- Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止
iOS开发中的触摸事件
- 默认的UIView是不能进行多指触控操作的,需要修改UIView的属性才可以
- iOS开发中应避免使用双击事件
重写hitTest方法
- 默认子控件不在父控件上是不能进行点击的,所以需要重写hitTest方法实现点击效果
事件传递
- touchesBegan的默认做法是把事件传递给上一个响应者(默认是父控件),当上一个响应者为控制器时,应交由控制器处理
手势识别器——UIGestureRecognizer
- 手势识别的代理方法,要遵守UIGestureRecognizerDelegate协议
// 是否允许开始触发手势
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return NO;
}
// 是否允许同时支持多个手势,默认是不支持多个手势
// 返回yes表示支持多个手势
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
// 是否允许接收手指的触摸点
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
// 获取当前的触摸点
CGPoint curP = [touch locationInView:self.imageView];
if (curP.x < self.imageView.bounds.size.width * 0.5) {
return NO;
}else{
return YES;
}
}
自动提示宏
- 宏的操作原理,每输入一个字母就会直接把宏右边的拷贝,并且会自动补齐前面的内容
// 宏里面的#,会自动把后面的参数变成C语言的字符串
#define keyPath(objc,keyPath) @(((void)objc.keyPath,#keyPath))
NSLog(@"%@",[keyPath(_mainV, frame) class]);
抽屉效果
- 利用KVO时刻监听mainV的frame属性的改变
// 利用KVO时刻监听mainV的frame属性
// Observer:观察者 谁想监听
// KeyPath:监听的属性
// options:监听新值的改变
[_mainV addObserver:self forKeyPath:keyPath(_mainV, frame) options:NSKeyValueObservingOptionNew context:nil];
// 只要监听的属性一改变,就会调用观察者的这个方法,通知你有新值
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@",NSStringFromCGRect(_mainV.frame));
if (_mainV.frame.origin.x > 0) { // 往右边移动,隐藏蓝色的view
_rightV.hidden = YES;
}else if (_mainV.frame.origin.x < 0){ // 往左边移动,显示蓝色的view
_rightV.hidden = NO;
}
}
// 在对象销毁的时候,一定要注意移除观察者
- (void)dealloc
{
// 移除观察者
[_mainV removeObserver:self forKeyPath:@"frame"];
}
网友评论