La définition de la couche de masque sur la sous-vue de UITableViewCell annule les contraintes de mise en forme automatique

J'ai un UITableViewCell avec plusieurs sous-vues. L'une des sous-vues est un UILabel et la taille de la cellule est dimensionnée dynamicment en fonction de la quantité de text dans UILabel . Cela fonctionne parfaitement.

J'ai une autre sous-vue dans la cellule qui a aussi des contraintes. Cette sous-vue est toujours supposée avoir exactement la même hauteur que la cellule. Cela fonctionne parfaitement aussi bien.

Cependant, je rencontre des problèmes lorsque j'essaie de définir un calque de masque sur cette sous-vue. La couche de masque fonctionne correctement, mais la hauteur de la sous-vue est incorrecte et la hauteur n'est pas la même que celle de la cellule.

Voici mon code de couche de masque:

 UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.mySubview.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(10, 10)]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = self.mySubview.bounds; maskLayer.path = maskPath.CGPath; self.mySubview.layer.mask = maskLayer; 

J'ai fait des searchs et essayé de find un moyen de résoudre ce problème afin que je puisse à la fois définir le calque du masque et que la sous-vue ait la bonne hauteur, mais je n'ai pas réussi à le faire fonctionner.

J'ai vu cette solution recommandée plusieurs fois maintenant:

 [self setNeedLayout]; [self layoutIfNeeded]; // Customize cell after here 

Mais cela ne marche pas pour moi non plus. Y at-il un moyen pour moi de savoir quand les contraintes de layout automatique ont été appliquées afin que je puisse ensuite appliquer le calque de masque après?

Le code de couche de masque est très simple, il utilise les limites de la sous-vue, et les limites sont désactivées car il utilise les limites qui existent avant que les contraintes aient été appliquées et que la sous-vue ait la hauteur correcte. Au less, je pense que je comprends cela correctement.

J'ai finalement compris. Je ne suis pas sûr si c'est l'endroit correct pour mettre ceci ou si cela pourrait causer des problèmes de performance, mais jusqu'ici cela fonctionne parfaitement:

 - (void)drawRect:(CGRect)rect { [super drawRect:rect]; UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:self.mySubview.bounds byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight) cornerRadii:CGSizeMake(10, 10)]; CAShapeLayer *maskLayer = [CAShapeLayer layer]; maskLayer.frame = self.mySubview.bounds; maskLayer.path = maskPath.CGPath; self.mySubview.layer.mask = maskLayer; } 

J'ai dû redéfinir drawRect: dans ma sous-class UITableViewCell et y définir le calque de masque.

J'ai eu le même problème et fait des choses dans - (void)drawRect:(CGRect)rect fait le travail mais cela pourrait être coûteux en termes de performance.

Vous pouvez appeler vos methods d'écrêtage ou d'ombre dans le sélecteur de performance

 [self performSelector:@selector(<your drawing method>) withObject:nil afterDelay:0.0000001 ];//a very low delay