索引
- iOS中的C语言结构体
- gesture的cancelsTouchesInView可让按钮同时触发target方法和tap手势添加的方法
- 让手势方法和touch方法并存
- 监听键盘的弹出与收起
1. iOS中的C语言结构体
在学习GPUImage的时候, 遇到一个GPUVector3
, 用来表示边缘阴影GPUImageVignetteFilter
的颜色, 默认的是黑色, 如何更改为自己想要的颜色?
command+右键 点进去看到是一个结构体
struct GPUVector3 {
GLfloat one;
GLfloat two;
GLfloat three;
};
typedef struct GPUVector3 GPUVector3;
查一下C语言的结构体的初始化方式, 选一个, 如下
GPUVector3 gv = {1,2,3};
2. gesture的cancelsTouchesInView取消按钮的触发方法
当我自己自定义一个button的时候,我发现,gesture的cancelsTouchesInView(取消视图的触发方法)属性非常重要;
例如这一段代码:
self.button.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(TapGestureMethod)];
[self.button addGestureRecognizer:self.tapGestureRecognizer];
[self.button addTarget:self action:@selector(touchMethod) forControlEvents:UIControlEventTouchUpInside];
当cancelsTouchesInView为YES的时候,不可以调用Button通过addTarget方法指定的点击触发的方法(touchMethod),但是可以调用执行通过手势的为该Button添加的方法(TapGestureMethod);
当cancelsTouchesInView为NO的时候,可以同时调用触发方法和手势添加的方法。
3. 让手势方法和touch方法并存
开发时, 我们会给页面加一个tapGesture
以隐藏键盘或者某些自定义视图, 如果这个页面同时也有CollectionView
, 那就会导致CollectionView
的代理方法didSelectItemAtIndexPath
和tapGesture
的触发方法发生冲突, 只能触发tapGesture
的方法.
解决方法很简单, 通过UIGestureRecognizerDelegate
的gestureRecognizer: shouldReceiveTouch:
方法
步骤一: 让tapGesture遵循代理UIGestureRecognizerDelegate
@interface XXX<UIGestureRecognizerDelegate>
- (void)addGesture {
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hideMiddleView)];
//必须要写
tapGesture.delegate = self;
[self addGestureRecognizer:tapGesture];
}
步骤二: 实现gestureRecognizer: shouldReceiveTouch:
方法
当点击的是collectionView的时候, 允许触发点击方法
#pragma mark UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
if (touch.view == self.collectionView) {
return YES;
}
return NO;
}
4. 监听键盘的弹出与收起
1. 添加监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHiden:) name:UIKeyboardWillHideNotification object:nil];
UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification是系统为我们设定好的, 直接使用即可.
2. 实现触发的方法
键盘出现时, 上移view
//键盘将要出现
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *dic = notification.userInfo;
//获取键盘的frame
NSValue *value = [dic objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = [value CGRectValue];
//获取键盘移动出现的时间
CGFloat showDuration = [[dic objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
[UIView animateWithDuration:showDuration animations:^{
self.view.transform = CGAffineTransformMakeTranslation(0, -CGRectGetHeight(keyboardRect));
}];
}
键盘隐藏时, 下移view
//键盘将要隐藏
- (void)keyboardWillHiden:(NSNotification *)notification {
NSDictionary *dic = notification.userInfo;
//获取键盘移动出现的时间
CGFloat showDuration = [[dic objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
//通过键盘动画的时间来设定页面上下移动的时间
[UIView animateWithDuration:showDuration animations:^{
self.view.transform = CGAffineTransformIdentity;
}];
}
3. 点击空白部分, 收起键盘
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//取消第一响应者
[self.tx resignFirstResponder];
}
这里的self.tx是textField
网友评论