2016-06-04 8 views
1

Zellenhöhe zu aktualisieren Zeit einen Auslass der Imageview Höhenbeschränkung, um wie so ich bin mit der Höhe des Imageview anzupassen:hat UITableView blättern

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)object 


cell.productImageView.file = (PFFile *)object[@"image"]; 
     [cell.productImageView loadInBackground:^(UIImage * _Nullable image, NSError * _Nullable error) { 

      cell.imageHeightConstraint.constant = image.size.height/image.size.width * cell.cardView.frame.size.width; 
      [cell.productImageView setNeedsUpdateConstraints]; 


      [UIView animateWithDuration:0.50f animations:^{ 
       [cell.cardView layoutIfNeeded]; 
      }]; 


     }]; 

In viewDidLoad

self.tableView.rowHeight = UITableViewAutomaticDimension; 
self.tableView.estimatedRowHeight = 350; 

Gibt es eine bessere Möglichkeit, die Höhe von ImageView zu ändern, als einen Ausgang für die Höhenbeschränkung zu verwenden?

Ich muss scrollen, um es auf die aktualisierte Höhenbeschränkung zu aktualisieren.

+0

Aktualisieren Sie einfach Ihre Tabellenansicht im Hauptthread. Sie erhalten die Daten im Hintergrund. Sie sollten Ihre UI-Elemente in Ihrem Haupt-Thread aktualisieren. – ridvankucuk

+0

Können Sie ein Beispiel geben? – farhan

Antwort

0

laden Sie Ihre tableView in viewWillAppear oder viewDidAppear so etwas,

-(void)viewDidAppear:(BOOL)animated{ 

    [self.tableView reloadData]; 

    } 
+0

Das Bild wird im Hintergrund heruntergeladen. Also macht dieser Code keinen Sinn. –

0

Ich zweifle, ob Ihr Code auch die Zellenhöhe basierend auf Bild Größe ändern. Im Inneren des Blocks, in dem Sie die Imageview Höhenbeschränkung aktualisieren setzen auch diesen Code:

let indexPath = self.tableView.indexPathForCell(cell) 
       if indexPath != nil { 
        self.tableView.beginUpdates() 
        self.tableView.endUpdates() 
       } 

Objective C:

NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
if (indexPath != nil) { 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
} 
+0

objektive c-version? – farhan

+0

@farhan Überprüfen Sie meine aktualisierte Antwort. Ich habe den objektiven C-Code nicht verifiziert, aber es sollte in Ordnung sein, denke ich. –

+0

Auch nur wundern, ist mit einer Höhe Steckdose wie ich bin, um die Höhe ein effizienter Weg, dies zu tun? – farhan

0

Sie sollten nur die Benutzeroberfläche auf dem Hauptthread ändern. Dies bedeutet, dass Sie Ihren Rückruf von sich dies ändern sollte:

[cell.productImageView loadInBackground:^(UIImage * _Nullable image, NSError * _Nullable error) { 
    // code here 
}]; 

dazu, die Grand Central Dispatch verwendet auf dem Haupt-Thread ausgeführt werden.

[cell.productImageView loadInBackground:^(UIImage * _Nullable image, NSError * _Nullable error) { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // code here. Will be run after dispatch_async returns. 
    }); 
}]; 

bearbeiten:
Dies, weil -tableView:cellForRowAtIndexPath: langsam sein, und deshalb -tableView:cellForRowAtIndexPath:object: werden, wenn sich eine Zelle blättert in Sicht genannt. Es ist besser, Ihre Bilder zwischenzuspeichern (sowohl für die Leistung als auch für die mobilen Daten Ihrer Nutzer). Ein eingebauter Weg dazu ist NSCache. Um dies zu tun, eine Eigenschaft Ihrer Klasse hinzufügen:

@property (strong, nonatomic) NSCache *cache; 

Dann in Ihrem viewDidLoad, erstellen Sie den Cache:

self.cache = [[NSCache alloc] init]; 

Wenn Sie ein Bild laden in -tableView:cellForRowAtIndexPath:object:, etwas zu tun, wie folgt aus:

void (^updateView)(UIImage *) = ^(UIImage * _Nullable image) { 
    cell.imageHeightConstraint.constant = image.size.height/image.size.width * cell.cardView.frame.size.width; 
    [cell.productImageView setNeedsUpdateConstraints]; 


    [UIView animateWithDuration:0.50f animations:^{ 
     [cell.cardView layoutIfNeeded]; 
    }]; 

}]; 
UIImage *cached = [self.cache objectForKey:cell.productImageView.file]; 
if (cached) { 
    cell.productImageView.image = cached; 
    updateView(cached); 
} else { 
    [cell.productImageView loadInBackground:^(UIImage * _Nullable image, NSError * _Nullable error) { 
     if (!error) { 
      [self.cache setObject:image forKey:cell.productImageView.file]; 
     } 
     updateView(image); 
    }]; 
} 
+0

es ist viel mehr Glitchy beim Scrollen – farhan

+0

Dies ist glitchy, weil Sie das Bild jedes Mal laden, wenn die Zelle in Sicht gescrollt wird. Ich würde Caching empfehlen.Ich werde meine Antwort bald aktualisieren. –

+0

@farhan Siehe bearbeiten. –

Verwandte Themen