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?
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
@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. –
Merci de m'avoir soutenu! J'ai trouvé la solution. – Andrea