UITableView Плохая производительность прокрутки с UITextField в подклассовой ячейке - PullRequest
1 голос
/ 12 июля 2011

Я работал над 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...