这个问题与ios8的新自定义键盘无关,但与我为ios7应用创建的现有键盘无关。
当从选项列表中为用户提供选择时,您可以将UIPickerView
用作键盘。但是在某些情况下,我只有两种选择,在这种情况下,我不喜欢选择器视图。因此,我创建了自己的UITableView
键盘。该键盘的大小取决于表格视图中的行数(最大高度)。我将键盘的高度设置为ViewWilAppear
。这在ios7中效果很好,但在ios8中,未考虑新高度。我不明白这是怎么回事。谁能帮助我在ios8中重新启用此功能。
ios7中的键盘(对不起,总的来说,我不知道如何缩放它):
ios8中的键盘:
我的键盘代码:
@interface LBTableKeyBoardVC () <UITableViewDelegate, UITableViewDataSource>
// List view in table form
@property (weak, nonatomic) IBOutlet UITableView *tableView;
// Last selected item in list
@property (strong, nonatomic) NSIndexPath *lastSelected;
// flag for using selecting mark when selecting a item
@property (nonatomic) BOOL selectionMark;
@end
@implementation LBTableKeyBoardVC
#define MAX_HEIGHT_KEYBOARD 245
#pragma mark - View initialization
- (id)initWithData:(NSArray *)data {
// set data
self.listData = data;
// init view controller
self = [self initWithNibName:@"LBTableKeyBoardVC" bundle:nil];
return self;
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
[self setup];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self setup];
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];
// [self setNewHeight:[NSNumber numberWithInteger:(self.listData.count * self.tableView.rowHeight)]];
[self performSelector:@selector(setNewHeight:) withObject:[NSNumber numberWithInteger:(self.listData.count * self.tableView.rowHeight)] afterDelay:0];
}
- (void)setup {
// initialize table view
self.tableView.delegate = self;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"ListItem"];
// resize keyboard if necessary
// This is the code that will make sure the view does not get resized to the default keyboard frame size
self.view.autoresizingMask = UIViewAutoresizingNone;
self.tableView.rowHeight = 44;
self.selectionMark = YES;
}
- (void)dealloc {
self.tableView.delegate = nil;
self.delegate = nil;
self.listData = nil;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)setNewHeight:(NSNumber *)height {
NSInteger currentHeight = self.view.frame.size.height;
NSInteger heightInt = [height integerValue];
if (heightInt != currentHeight) {
if (heightInt > MAX_HEIGHT_KEYBOARD) {
heightInt = MAX_HEIGHT_KEYBOARD;
}
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, heightInt);
}
}
#pragma mark UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [self.listData count];
}
- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"ListItem";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
cell.textLabel.text = [self textForRowAtIndexPath:indexPath];
cell.backgroundColor = [UIColor colorWithHexString:@"C7CBD3"];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (self.selectionMark) {
// deselect old
UITableViewCell *old = [self.tableView cellForRowAtIndexPath:self.lastSelected];
old.accessoryType = UITableViewCellAccessoryNone;
[old setSelected:NO animated:YES];
// select new
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
cell.accessoryType = UITableViewCellAccessoryCheckmark;
cell.selectionStyle = UITableViewCellSelectionStyleDefault;
[cell setSelected:YES animated:YES];
// keep track of last selected
self.lastSelected = indexPath;
}
[self.delegate keyboard:self.view selectedItem:[self textForRowAtIndexPath:indexPath]];
}
#pragma mark - List data
- (NSString *)textForRowAtIndexPath:(NSIndexPath *)indexPath {
return [self.listData objectAtIndex:indexPath.row];
}
@end
根据要求编辑:
我按如下方式创建键盘:
- (LBTableKeyBoardVC *)genderKeyBoard {
if (!_genderKeyBoard) {
_genderKeyBoard = [self tableKeyBoardWithData:@[NSLocalizedString(@"Male", "Gender keyboard option for male"), NSLocalizedString(@"Female", "Gender keyboard option for female")]];
}
return _genderKeyBoard;
}
我UITextField
在自定义中使用键盘UITableViewCell
:
textFieldCell.textField.inputView = self.genderKeyBoard.view;
尽管旧的解决方案无法正常运作,但我还是不明白,尽管它仍然可以正常工作。所以,如果有人知道为什么...我仍然有兴趣了解更多信息。
解决方案:
- (void)setup {
// initialize table view
self.tableView.delegate = self;
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"ListItem"];
// resize keyboard if necessary
// This is the code that will make sure the view does not get resized to the default keyboard frame size
self.view.autoresizingMask = UIViewAutoresizingNone;
self.tableView.rowHeight = KEYBOARD_ROWHEIGHT;
// set height of keyboard view according the number of rows in the table
[self setNewHeight:[NSNumber numberWithInteger:(self.listData.count * self.tableView.rowHeight)]];
self.selectionMark = YES;
}
我在中设置了新的高度setup
。在这里,我已经知道表格的数据,并且可以计算键盘视图的高度。我删除了对setNewHeight:
in的呼叫viewWillAppear:
。现在,键盘按预期出现。
与ios7相比,我不得不改变另一件事。我必须以编程方式设置表格的行高。在xib文件中,行高已经定义为44,但是当我使用NSLog打印行高时,它的值为-1?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句