2014-11-05 4 views
7

Ich arbeite an einem Projekt, das sowohl iOS7 als auch iOS8 ist. Und ich stieß auf diesen Fehler auf iOS8, wo die Tabellenansicht "springt", wenn ein Element ausgewählt wird.UITableView Fehler in iOS8 bei der Auswahl von Elementen mit geschätztenHöhen anders als rowHeight

Dieser Fehler ist nur vorhanden, wenn die geschätzte Höhe festgelegt ist und sich von der Zeilenhöhe unterscheidet.

Hier sind zwei Gifs mit dem gleichen Code in iOS8 und iOS7. Erste iOS8:

TableView in iOS8

Und jetzt in iOS7:

TableView in iOS7

ich ein Beispielprojekt gemacht haben, zeigt den Bug hier: https://github.com/bjarkehs/TableViewiOS8Bug

Ich bin nicht sicher, ob ich einfach bin Ich vermisse etwas, aber ich stecke mit diesem Problem fest und konnte dazu nichts finden.

Hier sind meine Tableview Methoden:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == 1) { 
     return 30; 
    } 
    return 20; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    cell.textLabel.text = [NSString stringWithFormat:@"%@ %ld", @"Wat", indexPath.row]; 
    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 45.f; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 50.f; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self.navigationController pushViewController:[UIViewController new] animated:YES]; 
} 

Hier ist ein Beispiel Viewcontroller, wo die berechnete Höhe nicht fest einprogrammiert ist, das gleiche Problem zeigt:

#import "ViewController.h" 

@interface ViewController() 

@property (weak, nonatomic) IBOutlet UITableView *tableView; 

@end 

@implementation ViewController { 
    NSMutableArray *_items; 
    CGFloat _estimatedHeight; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableView.delegate = self; 
    self.tableView.dataSource = self; 

    _estimatedHeight = 70.f; 

    CGFloat randomOffset = 30.f; 

    _items = [NSMutableArray new]; 
    for (NSInteger i = 0; i < 3; i++) { 
     NSMutableArray *tempItems = [NSMutableArray new]; 
     for (NSInteger j = 0; j < 30; j++) { 
      NSInteger offset = arc4random_uniform(randomOffset); 
      [tempItems addObject:@(_estimatedHeight + (randomOffset/2) - offset)]; 
     } 
     [_items addObject:tempItems]; 
    } 
    // Do any additional setup after loading the view. 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 3; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (section == 1) { 
     return 30; 
    } 
    return 20; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    cell.textLabel.text = [NSString stringWithFormat:@"%@ %ld", @"Wat", indexPath.row]; 
    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return _estimatedHeight; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return [[[_items objectAtIndex:indexPath.section] objectAtIndex:indexPath.row] floatValue]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self.navigationController pushViewController:[UIViewController new] animated:YES]; 
} 

@end 
+0

Unter Umständen müssen Sie Ihre Tableview Methoden hier posten. – latenitecoder

+0

Ja, das könnte ich auch. Die Tabellenansichtsmethoden sind jetzt da. –

+0

Vielleicht bin ich zurückgeblieben, aber ich kann keinen Unterschied zwischen 7 und 8 sehen. Was ist das genaue Problem? –

Antwort

-1

Ihre Implementierung für geschätzte Höhe Für Bei Index ist nicht etwas, was ich vorher gesehen habe. Werfen Sie einen Blick auf das, wo ich dieses Muster detailed mit ...

Estimated Height Example

+0

Dies ist nur ein Beispielprojekt. Ich zeige Ihnen nur den einfachsten Fall, bei dem die geschätzte Höhe nicht der tatsächlichen Höhe der Zelle entspricht. Die tatsächliche Höhe kann zwischen 40 und 60 Pixel liegen, aber die Implementierung im Beispielprojekt würde nur zu mehr Komplexität führen, ohne das Beispiel zu ergänzen. –

+0

Nicht sicher, was Sie meinen, aber Höhe schätzen arbeitet nach den Prinzipien, die Sie eine 'Prototyp'-Zelle erstellen, konfigurieren Sie es und es ist Subviews Eigenschaften (Etiketten, Positionen usw.) dann erhalten Sie die Höhe. Ihr Beispiel hat fest codierte Werte, die keinen wirklichen Vorteil bringen, ABER die Tabelle seltsam zu machen. – latenitecoder

+0

Darüber hinaus haben Sie die Höhe fest programmiert, die nur geschätzte Berechnungen negiert – latenitecoder

Verwandte Themen