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:
Und jetzt 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
Unter Umständen müssen Sie Ihre Tableview Methoden hier posten. – latenitecoder
Ja, das könnte ich auch. Die Tabellenansichtsmethoden sind jetzt da. –
Vielleicht bin ich zurückgeblieben, aber ich kann keinen Unterschied zwischen 7 und 8 sehen. Was ist das genaue Problem? –