在我们的实际开发中,CollectionView是一种非常实用而又稍难的控件,如果想要在复杂的场景下使用,则需要考虑的比较全面。如果又在CollectionView添加其他的控件,比如在cell里面再添加一个按钮,那么点击触发的事件前后顺序就非常重要了。再者,如果一个界面中包含了一个输入控件,需要弹出键盘时,键盘遮挡对于界面上的其他控件的使用就会造成较大的影响。今天我的案例具体需求描述下:界面中有一个TextField,点击输入的时候弹出键盘,并且整个界面向上移动,让键盘不遮挡其他控件。并且在点击界面背景、CollectionView空白部分,cell,和cell上面的按钮的时候可以收回键盘。并且在点击cell的时候可以触发didSelected方法,点击cell上面的按钮触发另一个点击方法。案例代码已经上传至 https://github.com/chenyufeng1991/ShowHiddenKeyboard 。欢迎大家下载使用。如果想对CollectionView有更为复杂的用法,可以移步这里 https://github.com/chenyufeng1991/CollectionView 。还有就是项目中使用Masonry来进行自动布局,Masonry的使用可以参考这篇博客《Autolayout第三方库Masonry的入门与实践》 。
(1)首先在AppDelegate.h中定义一些全局变量
//定义宏,用于block
#define WeakSelf(weakSelf) __weak __typeof(&*self)weakSelf = self;
typedef NS_ENUM(NSInteger,KeyBoardState){
KeyboardHidden = 0,
KeyboardShowing
};
定义WeakSelf宏定义是因为在使用Masonry的时候会大量用到block,为了防止引起循环引用,需要使用__weak修饰self.
下面的枚举是键盘的两种状态,显示或者隐藏。
(2)我要实现的UI效果图如下:
。
其中黄色部分是一个ImageView,背景设置了黄色。绿色部分是一个TextField。下面带图片的黑色部分是一个CollectionView,那张图片就是一个cell。我使用Masonry来
实现下面的UI。
先声明下属性:
@property (nonatomic, strong) UIView *contentView;
@property (nonatomic, strong) UIImageView *topImageView;
@property (nonatomic, strong) UITextField *inputField;
@property (nonatomic, strong) UICollectionView *collectionView;
@property (nonatomic, strong) NSMutableArray *collArr;
@property (nonatomic, assign) KeyBoardState status;
布局:
// 包容整个界面的容器View
CGRect tureFame = self.view.frame;
tureFame.origin.y = 64;// 获取剔除导航栏后的真正y位置
self.contentView = [[UIView alloc] init];
self.contentView.backgroundColor = [UIColor whiteColor];
self.contentView.frame = tureFame;
self.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:self.contentView];
// 顶部图片
WeakSelf(weakSelf);
self.topImageView = [[UIImageView alloc]