2014-04-17 2 views
1

J'ai un prototype de cellule dans mon storyboard.
Fondamentalement, la cellule est divisée en deux parties:Sous-classe UITableViewCell avec mise en page automatique comment changer la priorité des contraintes à l'exécution

  • vue texte
  • une vue de l'image

La cellule est initialisé avec les valeurs passage d'un objet à lui-même des cellules. À l'intérieur de cette méthode, la cellule définit ses éléments aux valeurs transmises.
L'idée principale était de changer la disposition des cellules en fonction de la présence de l'image ou du texte. Pour ce faire j'ai surcontraint le UITextView et le UIImageView en ajoutant, d'un côté, deux contraintes avec des priorités différentes. La priorité changera en fonction des objets passés. Par exemple, le UITextView a deux lignes pointillées, elles représentent les deux contraintes avec des priorités différentes et des valeurs constantes différentes. Le premier (lecture de LtoR) a une priorité de 910 et une constante de 156, le second a une priorité de 900 et une constante de 20.
Dans l'éditeur de storyboard, si j'échange les 2 priorités j'obtiens visuellement ce que je vouloir réaliser.
Le code cellulaire:

- (void) updateConstraints { 
    if (self.postObject.timelinePostText && self.postObject.timelinePostMultimedia) { 
     self.imageMinusTextViewConstraint.priority = 900; 
     self.imagePlusTextViewConstraint.priority = 910; 
     self.textViewMinusImageViewConstraint.priority = 900; 
     self.textViewPlusImageViewConstraint.priority = 910; 

    } 
    else if (self.postObject.timelinePostMultimedia) { 
     self.imageMinusTextViewConstraint.priority = 910; 
     self.imagePlusTextViewConstraint.priority = 900; 
    } 
    else if (self.postObject.timelinePostText) { 
     self.textViewMinusImageViewConstraint.priority = 910; 
     self.textViewPlusImageViewConstraint.priority = 900; 
    } 

    [super updateConstraints]; 
} 



- (void) configureCellWith: (AFTimelinePostObject*) postObject { 
    self.postObject = postObject; 
    self.userNameLabel.text = postObject.timelinePostOriginalPoster; 
    self.dateLabel.text = [[AFTimelinePostObject dateFormatterInternet] stringFromDate:postObject.timelinePostDateObject]; 
    self.postTitleLabel.text = postObject.timelinePostTitle; 
    self.multimediaMediaType = postObject.timelinePostMultimedia ? [self checkMediaTypeAtPath: postObject.timelinePostMultimedia] : kMediaTypeUnknown; 
    if (postObject.timelinePostMultimedia && postObject.timelinePostText) { 
     [self.postImageView setImageWithURL:[NSURL URLWithString:postObject.timelinePostMultimedia] placeholderImage:nil]; 
     self.postTextView.text = postObject.timelinePostText; 
    } 
    else if (postObject.timelinePostMultimedia) { 
     [self bringSubviewToFront:self.postImageView]; 
     [self.postImageView setImageWithURL:[NSURL URLWithString:postObject.timelinePostMultimedia] placeholderImage:nil]; 
    } 
    else if (postObject.timelinePostText) { 
     [self bringSubviewToFront:self.postTextView]; 
     self.postTextView.text = postObject.timelinePostText; 
     self.postImageView.image = nil; 
    } 
    [self setNeedsUpdateConstraints]; 
    [self updateConstraintsIfNeeded]; 
    [self setNeedsLayout]; 
    [self layoutIfNeeded]; 

} 


Suppression d'une vue n'est pas une solution parce que les cellules sont recyclées et je devrais ajouter à nouveau si nécessaire, mais de cette façon, je pense que je manque l'avantage de la performance liés au recyclage.
Malheureusement, les cellules restent également divisées en texte et en image, sans changer leurs images en fonction des données transmises.
Qu'est-ce qui me manque?

Répondre

1

Ne pas supprimer les vues de contraintes. Au lieu de cela, connectez les contraintes que vous avez configurées dans xib/storyboard à un point de vente dans le code, et modifiez sa valeur constant dans votre méthode configureCell. Ne jouez pas avec les priorités. Changez la constante en fonction de l'existence d'une image ou d'un texte.

Si votre logique ne permet soit texte cellulaire ou cellule d'image, vous pouvez configurer deux cellules différentes avec des identifiants différents et dequeue en conséquence. Cela vous simplifierait la configuration de la logique.

En outre, au lieu de

[self setNeedsUpdateConstraints]; 
[self updateConstraintsIfNeeded]; 
[self setNeedsLayout]; 
[self layoutIfNeeded]; 

Appelez simplement [self setNeedsLayout];

+0

Merci Leo, pour vos suggestions. En fait, le code de production utilise des cellules différentes pour le type de possibilité. Je ne veux pas changer la constante, car je pense que la possibilité de ne travailler que sur l'éditeur de storyboard me manquera plus tard, oui je peux échanger les valeurs constantes entre les deux. Le point ici est que ce que je veux faire est possible, je suis assez sûr à ce sujet, mais je ne comprends pas pourquoi ne fonctionne pas, ou au moins je veux être sûr que ce n'est pas possible. – Andrea

+0

@Andrea Il me semble que la raison pour laquelle vous voyez encore la vue texte et la vue image est qu'il n'y a pas de "combat" entre les contraintes, donc pas de priorité car la cellule satisfait les contraintes de disposition. –

+0

Merci de m'avoir soutenu! J'ai trouvé la solution. – Andrea

1

Eh bien, je l'ai extrait un petit échantillon pour rendre les choses simples.Là où essentiellement deux erreurs:

  1. Les priorités ne devraient pas être mise à jour dans updateConstraints, je tente toujours de trouver une réponse tout à fait clair sur le marsouin de cette méthode, mais il semble que vous ne devez utiliser que si vous ajoutez (probablement supprimer est pas considéré) contrainte
  2. j'envoyais la - bringSubViewToFront au parent mal, le bon est le -contentView

est ici le bon code, merci @Leo pour me soutenir.

//- (void) updateConstraints { 
// if (_postObject[TEXT_KEY] && _postObject[IMAGE_NAME_KEY]) { 
//  self.imageMinusTextViewConstraint.priority = 800; 
//  self.imagePlusTextViewConstraint.priority = 999; 
//  self.textViewMinusImageViewConstraint.priority = 800; 
//  self.textViewPlusImageViewConstraint.priority = 999; 
//   
// } 
// else if (_postObject[IMAGE_NAME_KEY]) { 
//  self.imageMinusTextViewConstraint.priority = 999; 
//  self.imagePlusTextViewConstraint.priority = 800; 
// } 
// else if (_postObject[TEXT_KEY]) { 
//  self.textViewMinusImageViewConstraint.priority = 999; 
//  self.textViewPlusImageViewConstraint.priority = 800; 
// } 
// 
// [super updateConstraints]; 
//} 
// 
// 
//- (void) layoutSubviews { 
// [super layoutSubviews]; 
//} 



- (void) configureCellWith: (NSDictionary*) postObject { 
    //Configurare gli elmenti già presenti 
    self.postObject = postObject; 

    //Check the presence of some kind of data 
    if (postObject[TEXT_KEY] && postObject[IMAGE_NAME_KEY]) { 
     self.imageMinusTextViewConstraint.priority = 800; 
     self.imagePlusTextViewConstraint.priority = 999; 
     self.textViewMinusImageViewConstraint.priority = 800; 
     self.textViewPlusImageViewConstraint.priority = 999; 
     self.postImageView.image = [UIImage imageNamed:postObject[IMAGE_NAME_KEY]]; 
     self.postTextView.text = postObject[TEXT_KEY]; 

    } 
    else if (postObject[IMAGE_NAME_KEY]) { 
     self.imageMinusTextViewConstraint.priority = 999; 
     self.imagePlusTextViewConstraint.priority = 800; 
     self.postImageView.image = [UIImage imageNamed:postObject[IMAGE_NAME_KEY]]; 
     self.postTextView.text = nil; 
     [self.contentView bringSubviewToFront:self.postImageView]; 

    } 
    else if (postObject[TEXT_KEY]) { 
     self.textViewMinusImageViewConstraint.priority = 999; 
     self.textViewPlusImageViewConstraint.priority = 800; 

     self.postTextView.text = postObject[TEXT_KEY]; 
     self.postImageView.image = nil; 
     [self.contentView bringSubviewToFront:self.postTextView]; 

    } 

// [self setNeedsLayout]; 
// [self layoutIfNeeded]; 



} 
Questions connexes