J'implémente un autogrowingUITextView
. Je vise un comportement similaire de la boîte de message dans WhatsApp, qui s'autogrows lorsque votre texte a plus de 1 ligne.Animer le redimensionnement UITextView en utilisant la mise en page automatique
J'utilise l'approche décrite ci-dessous qui stocke la contrainte de hauteur dans une sous-classe UITextView
et la modifie lorsque le texte change.
Ma solution s'anime correctement lorsque j'appuie sur la touche et que j'entre la touche dans le TextView, mais cela ne fonctionne pas lorsque je tape à la fin de la ligne. Dans ce cas, il change juste la taille instantanément.
L'exécution de l'animation sur le délégué méthode - (void)textViewDidChange:(UITextView *)textView
produit le même résultat. Comment puis-je animer correctement la hauteur de TextView à l'aide du système de mise en page automatique?
Je suis la mise en œuvre comme ceci:
@interface OEAutoGrowingTextView()
@property (strong, nonatomic) NSLayoutConstraint *heightConstraint;
@end
@implementation OEAutoGrowingTextView
- (id)initWithFrame:(CGRect)frame
{
if (!(self = [super initWithFrame:frame]))
{
return nil;
}
[self commonInit];
return self;
}
- (void)awakeFromNib
{
[self commonInit];
}
- (void)commonInit
{
// If we are using auto layouts, than get a handler to the height constraint.
for (NSLayoutConstraint *constraint in self.constraints)
{
if (constraint.firstAttribute == NSLayoutAttributeHeight)
{
self.heightConstraint = constraint;
break;
}
}
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextViewTextDidChangeNotification object:self];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)textDidChange:(NSNotification *)notification
{
self.heightConstraint.constant = self.contentSize.height;
[UIView animateWithDuration:1.0f animations:^
{
[self layoutIfNeeded];
}];
}
@end
Note: faire ce qui suit ne permet pas.
- (void)textDidChange:(NSNotification *)notification
{
self.heightConstraint.constant = self.contentSize.height;
[UIView animateWithDuration:1.0f animations:^
{
[self layoutIfNeeded];
for (UIView *view in self.subviews)
{
[view layoutIfNeeded];
}
}];
}
nouvelle mise à jour: Cela semble être un bug dans iOS 7.x, je pense qu'il est fixé sur iOS 8.0.
Oui, mais comment peut-on déclencher l'animation étant donné que le changement de contrainte se produit automatiquement dans la méthode autoLayout de UITextView? –
Cela n'arrive pas automatiquement. Si votre vue de texte change de taille, c'est parce que vous changez sa taille. Donc, si vous pouvez changer sa contrainte directement, vous pouvez changer sa contrainte avec l'animation. – matt
Il ne semble pas judicieux d'animer 'layoutIfNeeded' dans' layoutSubviews'; et cela ne fonctionne pas comme prévu. Ce que j'essaie de me demander, c'est où dois-je animer 'layoutIfNeeded', étant donné que le changement de heightConstraint se produit dans' layoutSubviews' de 'UITextView'? –