UITableView/UICollectionView键盘问题

CartKeyBoard.png

滚动视图防止遮挡以及退键盘

某控制器中含有tableView,其cell上放置textField(textView),点击后弹出键盘,并且自动滚动表格防止遮挡,完成要收键盘。

#define DDYSCREENW [UIScreen mainScreen].bounds.size.width
#define DDYSCREENH [UIScreen mainScreen].bounds.size.height

@interface NACartController ()<UITableViewDelegate, UITableViewDataSource, ShoppingCellDelegate>
/** 展示表格 */
@property (nonatomic, strong) UITableView *tableView;
/** 用来回收键盘 */
@property (nonatomic, strong) UIView *keyboardView;
@end


@implementation NACartController

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setupTabelView];
    [self setupKeyBoardBackView];
    [self addKeyboardNotifications];
}

#pragma mark 添加表格视图
- (void)setupTabelView
{
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    _tableView.tableFooterView = [UIView new];
    _tableView.delegate = self;
    _tableView.dataSource = self;
    _tableView.backgroundColor = ORDER_BACK_COLOR;
    [self.view addSubview:_tableView];
}

#pragma mark - UITabelViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.groupArray.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NAShoppingHeaderModel *headerModel = self.groupArray[section];
    NSArray *goods = headerModel.goodsInfo;
    return goods.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NAShoppingCell *cell = [NAShoppingCell cellWithTableView:tableView];
    cell.model = self.modelArray[indexPath.section][indexPath.row];
    cell.cellType = ShoppingCellTypeDefault;
    cell.delegate = self;
    __weak __typeof__ (self)weakSelf = self;
    cell.textFieldIndexPathBlock = ^() {
        [weakSelf performSelector:@selector(scrollToCell:) withObject:indexPath afterDelay:0.3f];
    };
    return cell;
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    NAShoppingHeaderModel * headModel = self.groupArray[section];
    NAShoppingHeader * headView = [[NAShoppingHeader alloc] initWithSection:section HeadModel:headModel];
    headView.delegate = self;
    return headView;
}

#pragma mark - UITabelViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 44;
}

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    return 100;
}

#pragma mark - 键盘问题

#pragma mark 添加确定取消回收键盘视图
- (void)setupKeyBoardBackView {
    _keyboardView = [[UIView alloc] initWithFrame:CGRectMake(0, DDYSCREENH, DDYSCREENW, 28)];
    _keyboardView.backgroundColor = DDYColor(250, 250, 250, 1);
    _keyboardView.hidden = YES;
    
    UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    cancelBtn.titleLabel.font = [UIFont systemFontOfSize:13];
    cancelBtn.contentMode = UIViewContentModeLeft;
    [cancelBtn setTitle:@"取消" forState:UIControlStateNormal];
    [cancelBtn setTitleColor:[UIColor lightGrayColor] forState:UIControlStateNormal];
    cancelBtn.frame = CGRectMake(10, 0, 35, 28);
    [cancelBtn addTarget:self action:@selector(handleCancel:) forControlEvents:UIControlEventTouchUpInside];
    
    UIButton *okBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    okBtn.titleLabel.font = [UIFont systemFontOfSize:13];
    okBtn.contentMode = UIViewContentModeRight;
    okBtn.frame = CGRectMake(DDYSCREENW-45, 0, 35, 28);
    [okBtn setTitle:@"确定" forState:UIControlStateNormal];
    [okBtn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    [okBtn addTarget:self action:@selector(handleOK:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:_keyboardView];
    [_keyboardView addSubview:cancelBtn];
    [_keyboardView addSubview:okBtn];
    [self.view bringSubviewToFront:_keyboardView];
}

#pragma mark 键盘通知
-(void)addKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification object:nil];
}

#pragma mark 键盘弹出
- (void)keyboardWillShow:(NSNotification *)notification
{
    _keyboardView.hidden = NO;
    NSDictionary* info = [notification userInfo];
    CGFloat kbh = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height;
    [UIView animateWithDuration:0.2 animations:^{
        _keyboardView.ddy_y = self.view.ddy_h-kbh-28;
        _tableView.ddy_h = self.view.ddy_h-kbh-28;
    }];
}

#pragma mark 键盘收回
- (void)keyboardWillHide:(NSNotification *)notification
{
    
    [UIView animateWithDuration:0.2 animations:^{
        _tableView.ddy_h = self.view.ddy_h-44;
        _keyboardView.ddy_y = DDYSCREENH;
    } completion:^(BOOL finished) {
        _keyboardView.hidden = YES;
    }];
}

#pragma mark 点击取消
- (void)handleCancel:(UIButton *)sender
{
    [self.view endEditing:YES];
}

#pragma mark 点击确定
- (void)handleOK:(UIButton *)sender
{
    [self.view endEditing:YES];
}
- (void)scrollToCell:(NSIndexPath*) path {
    [_tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionNone animated:YES];
}

#pragma mark 移除通知
- (void)dealloc
{
    _tableView.delegate = nil;
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

cell利用textField的代理

// .h
typedef void (^indexPathOfTextFieldBlock)(void);

@property (nonatomic, copy) indexPathOfTextFieldBlock textFieldIndexPathBlock;

// .m
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    if (self.textFieldIndexPathBlock) {
        self.textFieldIndexPathBlock();
    }
}

滚动到底部

- (void)scrollToBottom
{
    CGFloat yOffset = 0; //设置要滚动的位置 0最顶部 CGFLOAT_MAX最底部
    if (self.tableView.contentSize.height > self.tableView.bounds.size.height) {
        yOffset = self.tableView.contentSize.height - self.tableView.bounds.size.height;
    }
    [self.tableView setContentOffset:CGPointMake(0, yOffset) animated:NO];
}

滚动到fo'o'te'r

键盘类型

typedef NS_ENUM(NSInteger, UIKeyboardType) {
    UIKeyboardTypeDefault,                // Default type for the current input method.
    UIKeyboardTypeASCIICapable,           // Displays a keyboard which can enter ASCII characters, non-ASCII keyboards remain active
    UIKeyboardTypeNumbersAndPunctuation,  // Numbers and assorted punctuation.
    UIKeyboardTypeURL,                    // A type optimized for URL entry (shows . / .com prominently).
    UIKeyboardTypeNumberPad,              // A number pad (0-9). Suitable for PIN entry.
    UIKeyboardTypePhonePad,               // A phone pad (1-9, *, 0, #, with letters under the numbers).
    UIKeyboardTypeNamePhonePad,           // A type optimized for entering a person's name or phone number.
    UIKeyboardTypeEmailAddress,           // A type optimized for multiple email address entry (shows space @ . prominently).
    UIKeyboardTypeDecimalPad NS_ENUM_AVAILABLE_IOS(4_1),   // A number pad with a decimal point.
    UIKeyboardTypeTwitter NS_ENUM_AVAILABLE_IOS(5_0),      // A type optimized for twitter text entry (easy access to @ #)
    UIKeyboardTypeWebSearch NS_ENUM_AVAILABLE_IOS(7_0),    // A default keyboard type with URL-oriented addition (shows space . prominently).
    UIKeyboardTypeAlphabet = UIKeyboardTypeASCIICapable, // Deprecated
};
  • UIKeyboardTypeDefault,常用于文本输入
UIKeyboardTypeDefault.png
  • UIKeyboardTypeASCIICapable,常用于密码输入
UIKeyboardTypeASCIICapable.png
  • UIKeyboardTypeNumbersAndPunctuation,和上一个键盘互相切换
UIKeyboardTypeNumbersAndPunctuation.png
  • UIKeyboardTypeURL,适用于网址输入
UIKeyboardTypeURL.png
  • UIKeyboardTypeNumberPad ,只有数字的数字键盘
UIKeyboardTypeNumberPad.png
  • UIKeyboardTypePhonePad,可用于拨号的数字键盘,带*#+
UIKeyboardTypePhonePad.png
  • UIKeyboardTypeNamePhonePad,字母及数字键盘,主次键盘分别如下:
UIKeyboardTypeNamePhonePad.png
UIKeyboardTypeNamePhonePad2.png
  • UIKeyboardTypeEmailAddress,适用于邮件地址输入的键盘
UIKeyboardTypeEmailAddress.png
  • UIKeyboardTypeDecimalPad,带“点”的数字键盘,可用于带有小数点的数字输入
UIKeyboardTypeDecimalPad.png
  • UIKeyboardTypeTwitter
UIKeyboardTypeTwitter.png
  • UIKeyboardTypeWebSearch,适用于网页搜索的键盘
UIKeyboardTypeWebSearch.png

大写类型

typedef NS_ENUM(NSInteger, UITextAutocapitalizationType) {
    UITextAutocapitalizationTypeNone,  // 不大写
    UITextAutocapitalizationTypeWords, // 单词首字母
    UITextAutocapitalizationTypeSentences, // 句子首字母
    UITextAutocapitalizationTypeAllCharacters, // 全大写字母
};

键盘外观

typedef NS_ENUM(NSInteger, UIKeyboardAppearance) {
    UIKeyboardAppearanceDefault,          // Default apperance for the current input method.
    UIKeyboardAppearanceDark NS_ENUM_AVAILABLE_IOS(7_0),
    UIKeyboardAppearanceLight NS_ENUM_AVAILABLE_IOS(7_0),
    UIKeyboardAppearanceAlert = UIKeyboardAppearanceDark,  // Deprecated
};

拼写检查

typedef NS_ENUM(NSInteger, UITextSpellCheckingType) {
    UITextSpellCheckingTypeDefault,
    UITextSpellCheckingTypeNo,
    UITextSpellCheckingTypeYes,
} NS_ENUM_AVAILABLE_IOS(5_0);

return类型

typedef NS_ENUM(NSInteger, UIReturnKeyType) {
    UIReturnKeyDefault,
    UIReturnKeyGo,
    UIReturnKeyGoogle,
    UIReturnKeyJoin,
    UIReturnKeyNext,
    UIReturnKeyRoute,
    UIReturnKeySearch,
    UIReturnKeySend,
    UIReturnKeyYahoo,
    UIReturnKeyDone,
    UIReturnKeyEmergencyCall,
    UIReturnKeyContinue NS_ENUM_AVAILABLE_IOS(9_0),
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,864评论 6 494
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,175评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,401评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,170评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,276评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,364评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,401评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,179评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,604评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,902评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,070评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,751评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,380评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,077评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,312评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,924评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,957评论 2 351

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,074评论 4 62
  • 好吧,今天一整天都在做绘本手工拓展,那么就来简单叙述一下这本Color Zoo。Color Zoo是一本集动物、颜...
    LittlePiggie阅读 2,577评论 0 1
  • 这是一个他和她的故事。 18岁的菡和21岁的磊。当菡推开那扇门时就开始了他们的故事。 菡在那场残酷的高考中成为了胜...
    等一个人咖啡z阅读 159评论 0 1
  • 画过很多黑白装饰画,不过一直没做过教程,朋友的小孩一直说想看看我怎么画的,于是就想到做一个教程给她看,画完之后又觉...
    一夏飘雪阅读 9,425评论 25 71
  • 越是在紧急的时候越不能慌乱,更不能责备。 Z没有足量完成任务,在交接的时候问了他一些情况,可他的回答让人对已完成任...
    Vivian_n阅读 144评论 0 0