estimatedRowHeight - nu o pot aplica
  [ Ignoră ]
Rank
Newbie
Din: 
Macuser din: 30.10.13

Salutare,

am o problema care-mi da de cap de cateva zile bune. Am tot incercat sa gasesc o solutie insa nici un efect.
Lucrez la o aplicatie gen Twitter pentru a invata Objective C - https://github.com/sbuzoianu/TwitterAuth
Fac totul in interior prin codare, fara a folosi Storyboard-ul.
Am doua clase care imi deseneaza celulele unui tabel:TAUITableViewCell si TAUITableViewCellWithImage, prima “deseneaza” o celula care nu contine imaginea din tweet, a doua contine si imaginea.
Problema mea e ca incerc sa folosesc in viewDidLoad estimatedRowHeight: pentru a avea autodimensionare pentru celule.

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

Atunci cand folosesc in teste estimatedRowHeight automat comentez metoda

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 320;
}

Nu vrea sa-mi functioneze de nici un fel.
Cand comentez tableView: heightForRowAtIndexPath: efectul este acesta: http://imgur.com/YRtgNA8
Cand folosesc tableView: heightForRowAtIndexPath: o celula cu imagine arata asa: http://imgur.com/XFrGrYc
iar una fara imagine arata asa: http://imgur.com/AYWdZ9i

Nu inteleg probabil mecanismul din spatele UITableView. Ma poate ajuta cineva pentru a intelege unde gresesc?

Profil
 
  [ Ignoră ]   [ # 1 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

Autoheight functioneaza in felul urmator: celula trebuie sa aibe constrangeri corecte. Heightforcellatindexpath instantiaza celula care-ti trebuie, o populeaza si apoi ii ia inaltimea. Practic acelasi cod ca si in cellforrowatindexpath. Cel mai bine urmareste niste tutoriale pentru ca sunt ceva optimizari ce le poti face. https://mkswap.net/m/ios/2015/07/08/uitableviewcells-with-dynamic-height.html

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 2 ]
Rank
Newbie
Din: 
Macuser din: 30.10.13

Multumesc pentru raspuns. Intradevar, totul tinea de adaugarea de constraints-uri care, corect fiind scrise, imi aduceau implicit si dimensionare dinamica a celulei.
Am insa in acest moment cateva intrebari:

1. Daca in viewDidLoad am setat  
self.tableView.estimatedRowHeight = 300.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;

practic, am notificat aplicatia ca voi folosi o dimensionare dinamica a inaltimii celulei.
Din acest moment
tableView: heightForRowAtIndexPath: mai are vreo utilitate? La mine, daca comentez sau nu functia metoda heightForRowAtIndexPath efectul este acelasi.

2. La ce foloseste   [celula layoutIfNeeded]? Probabil ca nu inteleg prea bine ciclul de generare si populare a unei celule.

3. Am o problema legata de imaginea dintr-un tweet.
Atunci cand startez aplicatia imaginea din tweet nu este afisata - tweetul cu rosu - http://imgur.com/bAbwex2
Atunci cand fac scroll in aplicatie - imaginea apare - http://imgur.com/wMwy9RW

Din ce-am citit e o problema legata de async insa eu tot inclin sa cred ca am scris codul ca lumea, punand in main thread activitatile de UIKit:

      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      NSDictionary *imageObject = media[0];
      NSString *mediaImag = [imageObject objectForKey:@“media_url_https”];
      mediaImag = [mediaImag stringByAppendingString:@”:small”];
      NSData *mediaData = [NSData dataWithContentsOfURL:[NSURL URLWithString:mediaImag]];
      dispatch_async(dispatch_get_main_queue(), ^{
        cell.mediaView.image = [UIImage imageWithData:mediaData];
      });
      });

Multumesc inca o data pentru sugestii!

Profil
 
  [ Ignoră ]   [ # 3 ]
Avatar
RankRankRankRank
Moderator
Din: Cluj-Napoca
Macuser din: 26.01.06

Ai dreptate, am uitat ca am facut cum am descris pentru ca aveam nevoie sa suport si ios7.
1. Nu mai e nevoie de heightForRowAtIndexPath
2. layoutIfNeeded il apelezi dupa ce modifici constrangerile din cod ca sa se aplice modificarile. Poti sa apelezi metoda si intr-o animatie si se animeaza modificarile.
3. Ai pus codul in main thread dar se executa mai tarziu din cauza threadului secundar, deci pana ti se incarca poza, UITableView deja a calculat de ce inaltime are nevoie. In cazul asta poti sa constrangi poza sa aibe inaltime fixa

 Semnătură 

Mcintoshing…

Profil
 
  [ Ignoră ]   [ # 4 ]
Rank
Newbie
Din: 
Macuser din: 30.10.13

Multumesc pentru sugestii, acum totul este functional.
Facusem constraints pentru width si nu pentru height.

      [self addConstraint: [NSLayoutConstraint
                    constraintWithItem:self.mediaView
                    attribute:NSLayoutAttributeHeight
                    relatedBy:NSLayoutRelationEqual
                    toItem:nil
                    attribute:NSLayoutAttributeNotAnAttribute
                    multiplier:1
                    constant:150]];

Acum totul e ok.
Multumesc pentru ajutor inca o data!

Profil