[PR]
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
数種類のセルを使用してもスクロール速度の低下を極力減らす方法
最近Tiny3Dで各基本図形の詳細設定をする画面のテーブルスクロールを少しでも高速にしようといろいろ試行錯誤していてわかったのですが、セルの再利用を行えるかの判定部分の処理はかなり重たいようです。スクロール時には画面に表示するセルが次々変化するため、その度に行われるセル再利用判定がスクロールの邪魔をしてしまっていたのです。
つまり、それらの判定を必要最小限に行うようにした方がテーブルのスクロールを高速に出来ます。そのためには、たとえ複数回の重複部分が発生してコードの行数が多くなろうと、セルのセクションや行での分岐後で、そのとき必要なセルに限定した再利用判定をした方が良いということになります。以前のコードをテーブルのスクロール速度も考慮したものに変更すると、以下のように書き換えられます。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.row) {
case 0: {
HorizontalSwitchTableViewCell *sCell =
(HorizontalSwitchTableViewCell *)[tableView
dequeueReusableCellWithIdentifier:@"HorizontalSwitchTableViewCell"];
if (sCell == nil) {
sCell = [[[HorizontalSwitchTableViewCell alloc]
initWithFrame:CGRectZero
reuseIdentifier:@"HorizontalSwitchTableViewCell"]autorelease];
}
sCell.selectionStyle = UITableViewCellSelectionStyleNone;
sCell.myDictionary = self.myDictionary;
sCell.editedKey = @"display";
[sCell.switchCtl setOn:[[myDictionaryobjectForKey:@"display"]boolValue]
animated:NO];
sCell.nomalLabel.text = NSLocalizedString(@"Display",@"");
return sCell;
break;
}
case 1: {
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero
reuseIdentifier:@"Cell"] autorelease];
}
cell.font = [UIFont systemFontOfSize:20];
cell.text = [NSString stringWithFormat:NSLocalizedString(@"Name
: %@",@""),[myDictionary objectForKey:@"name"]];
return cell;
break;
}
case 2: {
HorizontalPositionTableViewCell *pCell =
(HorizontalPositionTableViewCell *)[tableView
dequeueReusableCellWithIdentifier:@"HorizontalPositionTableViewCell"];
if (pCell == nil) {
pCell = [[[HorizontalPositionTableViewCell alloc]
initWithFrame:CGRectZero
reuseIdentifier:@"HorizontalPositionTableViewCell"] autorelease];
}
pCell.enabledSetting = YES;
pCell.titleLabel.text = NSLocalizedString(@"Center",@"");
pCell.leftValueLabel.text = [NSStringstringWithFormat:@"%f",[[myDictionary
objectForKey:@"centerx"]floatValue]];
pCell.centerValueLabel.text = [NSString
stringWithFormat:@"%f",[[myDictionary objectForKey:@"centery"]floatValue]];
pCell.rightValueLabel.text = [NSStringstringWithFormat:@"%f",[[myDictionary
objectForKey:@"centerz"]floatValue]];
return pCell;
break;
}
case 3: {
HorizontalPositionTableViewCell *pCell =
(HorizontalPositionTableViewCell *)[tableView
dequeueReusableCellWithIdentifier:@"HorizontalPositionTableViewCell"];
if (pCell == nil) {
pCell = [[[HorizontalPositionTableViewCell alloc]
initWithFrame:CGRectZero
reuseIdentifier:@"HorizontalPositionTableViewCell"]autorelease];
}
pCell.enabledSetting = YES;
pCell.titleLabel.text = NSLocalizedString(@"Rotate",@"");
pCell.leftValueLabel.text = [NSString
stringWithFormat:@"%f",[[myDictionary objectForKey:@"rotatex"]floatValue]];
pCell.centerValueLabel.text = [NSString
stringWithFormat:@"%f",[[myDictionary objectForKey:@"rotatey"]floatValue]];
pCell.rightValueLabel.text = [NSString
stringWithFormat:@"%f",[[myDictionary objectForKey:@"rotatez"]floatValue]];
return pCell;
break;
}
case 4: {
UITableViewCell *cell = [tableView
dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero
reuseIdentifier:@"Cell"] autorelease];
}
cell.font = [UIFont systemFontOfSize:20];
if ([myDictionary objectForKey:@"magnification"] == nil) {
[myDictionary setObject:[NSNumber numberWithFloat:1]
forKey:@"magnification"];
}
cell.text = [NSStringstringWithFormat:NSLocalizedString(@"Magnification:
%f",@""),[[myDictionary objectForKey:@"magnification"]floatValue]];
return cell;
break;
}
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"Cell"]
autorelease];
}
return cell;
}