resize uiview avec UILabel et l'animer correctement

J'ai un UIView comme conteneur avec un UILabel à l'intérieur comme ceci:

------------- --------- | | | | |Label text | |Label..| | | --> | | | | | | | | | | ------------- --------- 

Maintenant, quand j'utilise:

UIView animateWithDuration:animations:

et essayez de définir la largeur plus petite de l'UIView (qui contient le UILabel) puis au cours de l'animation, UILabel remplace soudainement par "…" sans avoir une transition en douceur vers elle. Je configure le masque autoresizing UILabel à UIViewAutoresizingFlexibleWidth, UIViewAutoresizingFlexibleRightMargin pour le garder à gauche et définir le contentmode à gauche.

Essayer autre mode de contenu comme: Échelle à remplir, Ajuster l'aspect, Aspect remplir ne résout pas mon problème non plus, car ils mettent à l'échelle le text, puis il semble étrange.

Quelqu'un a-t-il une idée de la transition en douceur pour UILabel?

J'ai animé mon label de la façon décrite il y a quelque time, mais il faut y mettre un peu de marge. Idée de base: – Ajouter l'label à un containerview avec clipsToBounds: YES. – Ne pas animer le cadre de l'label, mais plutôt animer le cadre de la description, donc votre label aura une transition en douceur. – Utilisez une label séparée pour l'Elipsis (…) afin que vous puissiez animer cette partie aussi.

Malheureusement, les labels ne sont pas à l'échelle. changer le cadre de celui-ci change où le text est placé, mais la taille du text ne se met pas à l'échelle de cette façon. L'animation de base est donc terminée, une alternative consiste à triggersr une timer qui réduit le cadre de l'label d'une quantité prédéterminée chaque fois que le minuteur se triggers.

Bien sûr, vous devez définir la propriété labels setAdjustsFontSizeToFitWidth sur YES .

REMARQUE: Si possible, évitez de triggersr une timer tous les 5/1 000 de seconde.

 - (void)fireTimer { timer = [NSTimer scheduledTimerWithTimeInterval:0.005 target:self selector:@selector(animate) userInfo:nil repeats:YES]; } - (void)animate { [label setAdjustsFontSizeToFitWidth:YES]; if (label.frame.size.width > 100) { [label setFrame:CGRectMake(label.frame.origin.x, label.frame.origin.y, label.frame.size.width-1, label.frame.size.height)]; }else{ [timer invalidate]; timer = nil; } } 

J'avais un problème similaire lors du redimensionnement d'un UILabel pendant une autorotation et je l'ai résolu en utilisant le CADisplayLink comme ceci.

D'abord, appelez displayLinkTimer dans la méthode willAnimateRotationToInterfaceOrientation.

 displayLinkTimer = [CADisplayLink displayLinkWithTarget:self selector:@selector(resizeTextLabel)]; [displayLinkTimer addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

Ensuite, redimensionnez l'label en la redimensionnant au même rythme qu'un UIView invisible que j'ai créé appelé textView. Le textView a un cadre identique à ce que je veux que le cadre de mon UILabel soit et sa taille est changée dans la méthode willAnimateRotationToInterfaceOrientation. J'ai été capable de resize au même rythme en accédant à la couche de présentation de textView.

 - (void)resizeTextLabel{ if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) { if (textLabel.frame.size.width < textView.frame.size.width -20) { textLabel.frame = CGRectMake(0, 0, [[textView.layer presentationLayer] frame].size.width, [[textView.layer presentationLayer] frame].size.height); }else{ [timer invalidate]; timer = nil; } } else{ if (textLabel.frame.size.width > textView.frame.size.width -20) { textLabel.frame = CGRectMake(0, 0, [[textView.layer presentationLayer] frame].size.width, [[textView.layer presentationLayer] frame].size.height); }else{ [timer invalidate]; timer = nil; } } } 

J'espère que cela aide quelqu'un.

Ancienne question, mais cela m'a aidé:

  override var frame: CGRect { didSet { self.layoutSubviews() } }