Image правильно не загружен в cellForRowAtIndexPath
метод делегата, вы (вероятно) загрузив изображение в фоновом режиме, поэтому cellForRowAtIndexPath
возвращается прежде, чем изображение готов.
Скачано изображение, вероятно, кэшировано, так что в следующий раз он будет загружен правильно.
post.downloadImage()
Лучше иметь обратный вызов для вызова при загрузке изображения, чтобы назначить загруженное изображение в соответствующую ячейку.
Имейте в виду, что пользователь может прокрутить эту ячейку на экране до загрузки изображения, поэтому лучше использовать уникальный идентификатор, чтобы прервать загрузку присвоенного изображения, если ячейка уже изменилась.
Вот пример для метода, который загружает изображение в фоновом режиме, а затем назначает его в клетку -
+ (void)loadImage:(NSString *)imageUrl onComplete:(void(^)(UIImage *image, BOOL loaded, NSString *callIdentifier))callback callIdentifier:(NSString *)callIdentifier {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul), ^{
[self downloadPicture:url onComplete:^(UIImage *image, BOOL loaded) {
dispatch_sync(dispatch_get_main_queue(), ^{
callback(image, loaded, callIdentifier);
});
}];
});
callback([UIImage imageNamed:@"placeholder"], NO, callIdentifier);
}
+ (void)downloadPicture:(NSString *)url saveTo:(NSString *)filePath onComplete:(void (^)(UIImage *image, BOOL loaded))onComplete {
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url] options:NSDataReadingMappedAlways error:&error];
if (!error) {
UIImage *image = [UIImage imageWithData:data scale:GTUserPictureScale];
if (onComplete)
onComplete(image, YES);
} else {
NSLog(@"Error loading user picture: %@", [error description]);
if (onComplete)
onComplete([UIImage imageNamed:@"missing"], NO);
}
}
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// ...
__weak MyClass *wself = self;
self.imageUrl = @"http://...";
[self loadImage:self.imageUrl onComplete:^(UIImage *image, BOOL loaded, NSString *callIdentifier) {
@synchronized(wself) {
if ([callIdentifier isEqualToString:wself.imageUrl]) {
if (loaded) {
wself.image = image;
}
} else
NSLog(@"Expired load image request for id %@", callIdentifier);
}
} callIdentifier:self.imageUrl];
// ...
}
изображения являются избыточными, они делают ваш вопрос трудно читать. Удалите изображения и поместите свою реализацию, в частности «cellForRowAtIndexPath». – Kof
, если высота ваших изображений фиксирована на постоянное значение, а ваши ограничения правильно установлены, высота ячейки должна быть правильно рассчитана. может быть, происходит то, что ваши изображения перекрываются со следующей ячейкой, потому что у них нет свойства 'clipToBounds = true' – Lucho
@Lucho, как бы установить это свойство? – Charles