2012-04-10 21 views
7

Otrzymuję adres URL obrazu w czasie wykonywania i chcę pobrać & wyświetlać te obrazy w tabeli. Obrazy zostaną pobrane asynchronicznie. Ważniejsze jest to, że chcę wyświetlać wszystkie te obrazy z ich rzeczywistymi rozmiarami.Zmienianie rozmiaru wysokości komórki tabeli zgodnie z pobraną wysokością obrazu

Uprzejmie mi pomóż. Z góry dzięki :)

+0

kilka pytań dla ciebie człowieka. Czy te obrazy zajmą całą szerokość ekranu 320px? czy będą one wyświetlane tuż pod drugim, niezależnie od szerokości? Lub jeśli szerokość poprzedniego obrazu jest mniejsza niż 320, a następna również mieści się w pozostałej szerokości (320-prev_img_width), to pojawi się obok obrazu prev lub poniżej prev. –

Odpowiedz

2

Sprawdź heightForRowAtIndexPath:. Oto kolejna post na ten temat.

1

za to u trzeba tworzyć niestandardowe UITableViewCell i u można ustawić rozmiar Table View komórki przy użyciu tego kodu

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    int rowHeight =0.0f; 

    // here u can get particular Url by indexPath.row, now create UIImage object using that Url 

    CGRect bioHeadingFrame = image.frame; 
    rowHeight = size.height; //get the height of that image 

    return rowHeight; 
} 

teraz wysokość twojej komórce tabeli jest zwiększenie według wysokości obrazu

+1

Co masz na myśli. Ale Aby pobrać i wyświetlić obraz w komórce widoku tabeli, używam klasy Asynchronous View. Przesyłam adres URL obrazu do tej klasy (klasa Asynchronous View) do pobrania. Dostaję rzeczywisty rozmiar obrazu dopiero po pobraniu obrazu. Jak mogę więc ponownie wczytać podgląd tabeli i utworzyć odpowiednią komórkę rozmiaru obrazu. – rahul

+1

wystarczy wyszukać: http://stackoverflow.com/a/4448393/207616 –

+1

relikd ma rację. reloadRowsAtIndexPaths jest kluczem. –

0

If asynchronicznego pobierania to jest twój prawdziwy problem, zapoznaj się z kategorią UIImageView biblioteki. Zwłaszcza ta funkcja:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage 

Możesz dołączyć tę kategorię UIimageview do swojego projektu i ustawić obrazy komórek pochodzące z tej klasy.

3

W metodzie delegata trzeba zaktualizować obraz po zakończeniu pobierania można użyć

[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] 
       withRowAnimation:UITableViewRowAnimationAutomatic]; 

Wywoła to znowu

-(CGFloat)tableView:(UITableView *)tableView 
heightForRowAtIndexPath:(NSIndexPath *)indexPath 

więc trzeba mieć to na podstawie wzrostu obrazka jeśli istnieje , domyślne hej lub obraz zastępczy, jeśli taki posiadasz.

3

Po pierwsze, zdecydowanie zalecam użycie SDWebImage do asynchronicznego pobierania, jeśli jeszcze tego nie zrobiłeś. W zależności od tego, co chcesz, możesz ustawić pamięć podręczną w pamięci lub na dysku - ta ostatnia jest wykonywana we właściwy sposób, zapisując je w specjalnym folderze pamięci podręcznej, więc iOS może je usunąć, gdy zabraknie miejsca. Zapewnia także przydatną kategorię w UIImageView, podobnie jak w przypadku AFNetworking, ale z większą liczbą opcji i opcjonalnym blokiem ukończenia. W ten sposób można zrobić coś takiego:

#import <SDWebImage/UIImageView+WebCache.h> 

... 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    // Create the cell... 

    [cell.myImageView setImageWithURL:[NSURL URLWithString:@"http://example.com/image.jpg"] 
       placeholderImage:[UIImage imageNamed:@"placeholder"] 
        completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) { 
     if (image != nil) { 
      [self.images insertObject:image atIndex:indexPath.row]; 
      [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:YES]; 
     } 
    }]; 
    return cell; 
} 

ten sposób można pobrać obraz asynchronicznie, ustaw UIImageView poprawnie, ale również skorzystać z bloku, aby zapisać obraz w NSMutableArray, więc można powiedzieć tableview właściwa wysokość. Informuje również widok tabeli, aby zaktualizować wysokość komórki, której obraz został załadowany. Wtedy, gdy widok tabeli musi wiedzieć, jak wysoko dana komórka jest, jeśli obraz został załadowany, będziemy się z niego rozmiar:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    id image = [self.images objectAtIndex:indexPath.row]; 
    if ([image isKindOfClass:[NSNull class]]) { 
     return defaultHeight; 
    } else { 
     return [image size].height + topPadding + bottomPadding; 
    } 
} 

ten sposób wiemy, wysokość nawet obrazów, które są wyłączone -screen (np. kiedy przewinąłeś na dół). To rozwiązanie zakłada, że ​​zaczynasz od zapełnienia wartości NSMutableArray wartościami NSNull, które są następnie zastępowane obrazami po ich załadowaniu. Wreszcie, jeśli chcesz, możesz użyć SDWebImageManager, aby ręcznie rozpocząć pobieranie jeszcze przed wyświetleniem komórek.

+0

dlaczego masz to +50 ?? – Rajneesh071

+0

Zgadzam się SDWebImage jest świetną biblioteką, ale nie powinna być właściwą odpowiedzią na to pytanie, powinna zdobyć głosy na pewno, ale nie punkty za bounty. –

3

Możesz dokonać rozmiaru UIImageView zgodnie z pobieraniem obrazu, ale da to zły wygląd.

więc proponuję, aby cały swój wizerunek samej wielkości, więc to będzie wyglądać dobrze i słodkie

można użyć tego, aby cały swój wizerunek samej wielkości.

+ (UIImage *)imageScaledToSizeWithImage:(UIImage *)imagewww andsizeee:(CGSize)size 
{ 
    //avoid redundant drawing 
    if (CGSizeEqualToSize(imagewww.size, size)) 
    { 
     return imagewww; 
    } 

    //create drawing context 
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f); 

    //draw 
    [imagewww drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)]; 

    //capture resultant image 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    //return image 
    return image; 
} 

Ale jeśli naprawdę chcesz, aby pokazać tabelę z różnej wielkości rzędu następnie dokonać zmienić rozmiar wiersza na czas wykonywania

kiedy dostaniesz obraz następnie zapisać obraz w słowniku z wartości klucza jest indexPath z rzędu .

[tableImageDict setObject:image forKey:[NSString stringWithFormat:@"%i,%i",indexPath.row,indexPath.section]]; 

a następnie ponownie załaduj swój wiersz tabeli.

[table reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationNone]; 

To zmieni swoją wysokość wiersza

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIImage *image = (UIImage *)[tableImageDict objectForKey: 
           [NSString stringWithFormat:@"%i,%i", 
            indexPath.row,indexPath.section]]; 


    if (image != nil) 
    { 
     return image.size.height; 
    } 
    else{ 
     return 44.0; 
    } 
} 
Powiązane problemy