iOS: Scaling UITextView avec pincement?

Je suis intéressé par la création de UITextView qui se développe de manière dynamic en tapant le text, et la mise à l'échelle lorsque l'user pince l'écran (un comportement similaire peut être trouvé dans TinyPost).

Lorsque vous tapez (sans pincer), textView se dilate bien. Quand vous pincez (sans taper), cela fonctionne très bien, mais quand vous pincez puis tapez, le text à l'intérieur est coupé.

Voici mon code:

 UIPinchGestureRecognizer *pinchGestRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scaleTextView:)]; pinchGestRecognizer.delegate = self; [bgFrameImageView addGestureRecognizer:pinchGestRecognizer]; - (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ createTextView.transform = CGAffineTransformScale(createTextView.transform, pinchGestRecognizer.scale, pinchGestRecognizer.scale); pinchGestRecognizer.scale = 1; } - (void)textViewDidChange:(UITextView *)textView{ CGSize textSize = textView.contentSize; textView.frame = CGRectMake(CGRectGetMinX(textView.frame), CGRectGetMinY(textView.frame), textSize.width, textSize.height); //update the size of the textView } 

Qu'est-ce que tu penses?

Essayer:

 - (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ CGFloat scale = pinchGestRecognizer.scale; createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale]; [self textViewDidChange:createTextView]; } 

Il redimensionne la taille de la police et recalcule la taille du contenu en utilisant votre code dans textViewDidChange.

Pour développer @Cocoanetics répondre ci-dessus. J'ai implémenté l'idée de gestion des gestes pour les strings atsortingbuées sur iOS 7 mais elle est extrêmement lente quand vous avez trop de changements de police dans votre string. Il y a aussi un bogue de mise en memory tampon ridicule dans iOS 7 où les notifications de modification continuent de se triggersr longtime après que vous ayez cessé de pincer – cela me callbackle le stupide tampon de keyboard dans les premières versions de PC-DOS. Quoi qu'il en soit, j'ai mis le code ci-dessous qui a fonctionné pour moi – même si cela ne m'a fait que m'informer que c'est une perte de time et que je dois donner à mes users un autre moyen de resize leurs fonts.

 - (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestureRecognizer { CGFloat scale = 0; NSMutableAtsortingbutedSsortingng *ssortingng; switch (pinchGestureRecognizer.state) { case UIGestureRecognizerStateBegan: self.old_scale = 1.0; self.last_time = [NSDate date]; break; case UIGestureRecognizerStateChanged: scale = pinchGestureRecognizer.scale - self.old_scale; if( [self.last_time timeIntervalSinceNow] < -0.2 ) { // updating 5 times a second is best I can do - faster than this and we get buffered changes going on for ages! self.last_time = [NSDate date]; ssortingng = [self getScaledSsortingngFrom:[self.textview.atsortingbutedText mutableCopy] withScale:1.0 + scale]; if( ssortingng ) { self.textview.atsortingbutedText = ssortingng; self.old_scale = pinchGestureRecognizer.scale; } } break; case UIGestureRecognizerStateEnded: case UIGestureRecognizerStateCancelled: case UIGestureRecognizerStateFailed: break; default: break; } } - (NSMutableAtsortingbutedSsortingng*) getScaledSsortingngFrom:(NSMutableAtsortingbutedSsortingng*)ssortingng withScale:(CGFloat)scale { [ssortingng beginEditing]; [ssortingng enumerateAtsortingbute:NSFontAtsortingbuteName inRange:NSMakeRange(0, ssortingng.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { if (value) { UIFont *oldFont = (UIFont *)value; UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize * scale]; [ssortingng removeAtsortingbute:NSFontAtsortingbuteName range:range]; [ssortingng addAtsortingbute:NSFontAtsortingbuteName value:newFont range:range]; } }]; [ssortingng endEditing]; return ssortingng; } 

Tout d'abord, ajoutez pinchGestureRecognize dans la méthode viewDidLoad:

  UIPinchGestureRecognizer *pinchOnTextfield = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(handleTextFieldFontOnAddMusicVc:)]; [self.myTextField addGestureRecognizer:pinchOnTextfield]; 

puis placez cette méthode dans votre viewController pour mettre à l'échelle la police du champ de text:

 - (void)handleTextFieldFontOnAddMusicVc:(UIPinchGestureRecognizer *)pinchGestRecognizer{ if (pinchGestRecognizer.state == UIGestureRecognizerStateEnded || pinchGestRecognizer.state == UIGestureRecognizerStateChanged) { CGFloat currentFontSize = self.myTextField.font.pointSize; CGFloat newScale = currentFontSize * pinchGestRecognizer.scale; if (newScale < 20.0) { newScale = 20.0; } if (newScale > 60.0) { newScale = 60.0; } self.myTextField.font = [UIFont fontWithName:self.myTextField.font.fontName size:newScale]; pinchGestRecognizer.scale = 1; } } 

UITextView est une sous-class de UIScrollView et en tant que tel, vous devez faire ce que vous faites avec n'importe quelle vue de défilement pour activer le zoom:

  • définir les propriétés d'échelle de zoom minimum et maximum
  • définir viewForZooming via la méthode scrollview delegate

… qui agrandit la vue entière du text.

Si vous voulez seulement faire un zoom sur le text, vous devez effectuer ces étapes via un outil de reconnaissance des mouvements de pincement:

  • récupérer la string actuelle atsortingbuée
  • parcourir les gammes de fonts et replace l'atsortingbut de police par un atsortingbut proportionnel
  • replace le text dans la vue de text avec votre version modifiée
  • probablement vous devez également définir la sélection de text après avoir défini le text

Pas la meilleure mais la solution facile serait:

Je ne connais pas exactement votre cas d'utilisation, mais je pense que cela n'a pas de sens dans de nombreux cas de soutenir dans un zoom pincement d'une application tout en tapant du text. Je voudrais simplement définir un drapeau, ce qui empêche le zoom pincement pendant que l'user tape du text.

Si vous voulez dire par la saisie de text, éditer la vue de text, vous pouvez terminer l'édition au début du geste de pincement et commencer à éditer après la fin du geste de pincement.