8

Sono interessato a creare UITextView che si espande in modo dinamico durante la digitazione del testo e il ridimensionamento quando l'utente pizzica lo schermo (un comportamento simile può essere trovato in TinyPost).iOS: ridimensionamento UITextView con pinching?

Quando si digita (senza pizzicare) il testo, la vista si espande. Quando pizzichi semplicemente (senza digitare) funziona bene, ma quando pizzichi e digiti, il testo all'interno viene tagliato.

Ecco il mio codice:

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 
    } 

Cosa ne pensi?

+2

Perché non basta avvolgerlo in un 'UIScrollView' e restituisce la vista del testo dal metodo' viewForZoomingInScrollView: '? –

risposta

11

Prova:

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestRecognizer{ 
    CGFloat scale = pinchGestRecognizer.scale; 

    createTextView.font = [UIFont fontWithName:createTextView.font.fontName size:createTextView.font.pointSize*scale]; 

    [self textViewDidChange:createTextView];  
} 

È scalabile fondamentalmente la dimensione del carattere e poi ricalcola la dimensione del contenuto utilizzando il codice in textViewDidChange.

+0

Ti consiglio di spiegare cosa fa ogni riga – Sirens

+0

@TheDeveloper fatto, mi dispiace per quello – k20

+0

hi @ k20, ho lo stesso problema e uso textFiled puoi darmi qualche soluzione ... Grazie .. – ilesh

0

UITextView è una sottoclasse di UIScrollView e come tale è necessario fare quello che fai con qualsiasi vista di scorrimento per consentire zoom:

  • impostare le proprietà scala massima dello zoom minimo e
  • impostare il viewForZooming via metodo delegato scrollview

... che ingrandisce l'intera visualizzazione del testo.

Se si desidera solo per ingrandire il testo, allora è necessario eseguire questa procedura tramite un sistema di riconoscimento pizzico gesto:

  • recuperare la stringa attribuito corrente
  • passeggiata attraverso i campi di carattere e sostituire l'attributo di carattere con un scalato una
  • sostituire il testo nella visualizzazione di testo con la versione modificata
  • probabilmente anche bisogno di impostare la selezione di testo dopo aver impostato il testo
+1

ogni possibilità che tu possa fornire un codice di esempio per camminare nel carattere varia e aumenta la dimensione del testo nella stringa degli attributi di uitextview. Sto cercando di fare proprio questo. –

+0

Non ce l'ho pratico ATM, in sostanza devi solo enumerare l'attributo font sulla stringa attribuita e poi sostituirlo con uno scalato. – Cocoanetics

0

Non è la soluzione migliore, ma facile sarebbe:

Non so esattamente il vostro caso d'uso, ma penso che non ha senso, in molti casi, per sostenere in un pizzico di zoom app durante la digitazione del testo. Vorrei solo impostare un flag, che impedisce lo zoom pizzico mentre l'utente sta scrivendo il testo.

Se si intende digitare il testo, modificare la visualizzazione del testo è possibile terminare la modifica all'inizio del gesto di pizzicamento e avviare la modifica dopo che il gesto di pizzicamento è terminato.

2

Per elaborare la risposta @Cocoanetics sopra. Ho implementato l'idea di gestione dei gesti per le stringhe attribuite su iOS 7 ma è proibitivamente lento quando si hanno troppe modifiche ai font nella stringa. C'è anche un ridicolo bug di buffering in iOS 7 dove le notifiche di Change continuano a sparare a lungo dopo che hai smesso di pizzicare - mi ricorda lo stupido buffer della tastiera nelle prime versioni di PC-DOS. Ad ogni modo, ho messo il codice qui sotto che ha funzionato per me, anche se è stato solo il risultato di informarmi che questa è una perdita di tempo e che ho bisogno di dare ai miei utenti un altro modo per ridimensionare i loro font.

- (void)scaleTextView:(UIPinchGestureRecognizer *)pinchGestureRecognizer 
{ 
    CGFloat scale = 0; 
    NSMutableAttributedString *string; 

    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]; 
       string = [self getScaledStringFrom:[self.textview.attributedText mutableCopy] withScale:1.0 + scale]; 
       if(string) { 
        self.textview.attributedText = string; 
        self.old_scale = pinchGestureRecognizer.scale; 
       } 
      } 
      break; 

     case UIGestureRecognizerStateEnded: 
     case UIGestureRecognizerStateCancelled: 
     case UIGestureRecognizerStateFailed: 
      break; 

     default: 
      break; 
    } 
} 

- (NSMutableAttributedString*) getScaledStringFrom:(NSMutableAttributedString*)string withScale:(CGFloat)scale 
{ 
    [string beginEditing]; 
    [string enumerateAttribute:NSFontAttributeName inRange:NSMakeRange(0, string.length) options:0 usingBlock:^(id value, NSRange range, BOOL *stop) { 
     if (value) { 
      UIFont *oldFont = (UIFont *)value; 
      UIFont *newFont = [oldFont fontWithSize:oldFont.pointSize * scale]; 
      [string removeAttribute:NSFontAttributeName range:range]; 
      [string addAttribute:NSFontAttributeName value:newFont range:range]; 
     } 
    }]; 
    [string endEditing]; 
    return string; 
} 
+0

Ciao amergin. Qualche miglioramento su questo codice o l'hai davvero abbandonato? Grazie per la tua risposta. – Winston

+0

@ Winston - sì, ha rinunciato al ridimensionamento dei caratteri e offre ora dimensioni predefinite che l'utente può scegliere. Bit zoppo ma sto lavorando entro i limiti dei framework. Potrebbe riprovarci in futuro per vedere se il codice sottostante è migliorato. – amergin

+0

Nel mio caso funziona davvero bene, perché non ho tanti caratteri come te. Il mio unico problema ora è limitare le dimensioni massime e minime dei caratteri per fermare il gesto di pizzicamento in modo che il testo non diventi troppo grande o troppo piccolo, e talvolta scompaia. Eventuali suggerimenti? Grazie. – Winston

2

Prima di tutto aggiungere pinchGestureRecognize nel metodo viewDidLoad:

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

poi mettere questo metodo nella viewController per scalare textfield font:

- (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; 

     } 

    } 
+0

Quando Zoom avanti e indietro si applicano a uitextview, quella formattazione originale di testo non dovrebbe essere modificata. Ma il testo verrà modificato e il testo in grassetto e in corsivo verrà convertito con un semplice testo –

+0

Nel mio caso, questa è la soluzione migliore rispetto alla risposta selezionata :) Grazie! – Panayot