Я работал над UITableView на iPad с UITextFields, содержащимися в ячейках, во многом как режим редактирования адресной книги.
Я создал подкласс UITableViewCell, чтобы создать свой собственный: FormCell, и добавил свойство UITextField * inputField в contentView ячейки в init. Затем я корректирую положение поля ввода в layoutSubviews.
У меня около 20 строк, и у меня плохая производительность прокрутки. Профиль инструментов дает около 15 кадров в секунду, когда я просто прокручиваю эти FormCells взад и вперед. Для сравнения, он показал 50+ кадров в секунду, если клетки были только обычного типа.
Удивительная вещь, когда я активирую один из inputField в ячейке, клавиатура показывает, и я могу прокручивать вперед и назад со скоростью 40 кадров в секунду, что очень плавно. для сравнения, адресная книга на iPad прокручивается со скоростью 58 кадров в секунду в режиме редактирования.
Может ли кто-нибудь посоветовать, что происходит и как я могу получить лучшую производительность без активации полей ввода в ячейках?
Спасибо,
вот код для FormCell:
@implementation FormCell
@synthesize inputField;
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
//Initialization code
inputField = [[UITextField alloc] init];
inputField.font = [UIFont systemFontOfSize:20];
inputField.minimumFontSize = 13;
inputField.adjustsFontSizeToFitWidth = YES;
inputField.autocapitalizationType=UITextAutocapitalizationTypeWords;
inputField.clearButtonMode = UITextFieldViewModeWhileEditing;
inputField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
inputField.returnKeyType = UIReturnKeyNext;
[self.contentView addSubview:inputField];
self.textLabel.font = [UIFont boldSystemFontOfSize:16];
[inputField release];
}
return self;
}
- (void)layoutSubviews{
[super layoutSubviews];
NSInteger cellWidth = self.contentView.frame.size.width;
if (self.textLabel.text) {
self.textLabel.frame = CGRectMake(20, 10, 100, 30);
[inputField setFrame:CGRectMake(140, 10, cellWidth-160, 30)];
}else{
[inputField setFrame:CGRectMake(10, 10, cellWidth-20, 30)];
}
}
- (void)prepareForReuse{
[super prepareForReuse];
self.textLabel.text = nil;
self.detailTextLabel.text = nil;
self.inputField.text = nil;
self.inputField.placeholder = nil;
self.inputField.enabled = YES;
self.inputField.hidden = NO;
self.accessoryView = nil;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
}
- (void)dealloc{
[super dealloc];
}
А вот код для cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *InputCellID = @"InputCell";
TextInputCell *cell = nil;
cell = (FormCell *)[tableView dequeueReusableCellWithIdentifier:InputCellID];
if (cell == nil) {
cell = [[[FormCell alloc] initWithStyle:UITableViewCellStyleValue2 reuseIdentifier:InputCellID] autorelease];
}
cell.textLabel.text = @"Name";
cell.inputField.placeholder = @"Name";
return cell;
}
EDIT:
Я только что понял, что, поскольку я использовал UIModalPresentationStylePageSheet, макс. FPS составляет 25. Если я использую UIModalPresentationStyleFormSheet, макс. FPS - 36. Максимальный FPS - 56 для UIModalPresetnationStyleFullScreen.
Может ли кто-нибудь объяснить мне, почему производительность прокрутки так плохо работает с PageSheet? Это действительно то, что я хочу использовать поверх FullScreen.