2012-11-15 9 views
6

Ho un UITextView e sto provando ad animare un cambiamento di frame quando l'utente tocca un pulsante. Fondamentalmente la visualizzazione del testo diventa più grande per adattarsi allo schermo in modo che possa visualizzare più testo, e quindi quando l'utente tocca nuovamente il pulsante, si restringe alla sua cornice originale.UITextView che anima la modifica del frame non anima la riallocazione del testo

I eseguire l'animazione utilizzando blocchi, in questo modo:

if(!isDisplayingDetailView) 
{ 
    //Expand view 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.detailView.frame = self.view.frame; 
        } 
        completion:^(BOOL finished){ 
         isDisplayingDetailView = YES; 
        }]; 
} 
else{ 
    //Shrink view. 
    [UIView animateWithDuration:0.5 
        animations:^{ 
         self.detailView.frame = self.detailFrame; 
         } 
        completion:^(BOOL finished){ 
         isDisplayingDetailView = NO; 
        }]; 
} 

Dove self.detailView rappresenta l'UITextView e self.detailFrame è solo un CGRect tiene il frame originale. isDisplayingDetailView è solo un BOOL per verificare se la vista è espansa o meno. Il mio problema è che il ridimensionamento del testo non è animato. Ho fatto alcuni screenshot da un'applicazione di test per illustrare il mio problema: App vista di default: Default view

La vista espansa:

Expanded view

Il TextView solo un momento dopo toccando il pulsante:

Shrinking view

Come si può vedere il testo si riduce automaticamente alla dimensione finale del fotogramma, senza alcun ki nd di animazione, mentre i limiti si stanno ancora animando. Immagino che sia il comportamento giusto, ma mi piacerebbe sapere se è possibile animare il testo insieme alla sua vista.

+0

Ciao, hai trovato una soluzione a questo, se sì per favore condividi con me, sono anche bloccato nello stesso problema –

+0

@VinayakaKarjigi scusa ma non ho trovato soluzione. –

+0

ha avuto lo stesso problema. la mia soluzione era di rendere un'immagine della vista testo posizionandola dove era la textview, nascondere la vista testuale e quindi animare l'immagine. – peko

risposta

2

Il testo nelle visualizzazioni di testo non funziona sempre come previsto. Per questo dovrai configurare un NSTimer e impostare la dimensione del frame su ogni tick.

fare qualcosa di simile:

textview.frame = CGRectMake (textview.frame.origin.x, textview.frame.origin.y, textview.frame.size.width-1, textview.frame.size.height-1); 

Poi quando è fatto avrei rimuovere completamente il TextView da superview e impostarlo a zero, e poi init uno nuovo. La ragione di ciò è che quando si cambiano i riquadri delle viste testuali per qualche motivo il riempimento viene aggiunto attorno alla casella del testo. Non lo noterai a meno che tu non modifichi il frame almeno un probabile 100 volte.

[textview removeFromSuperview]; 
textview = nil; 
textview = [[UITextView alloc] initWithFrame:CGRectMake(x, y, width, height)]; 
textview.text = yourTextString; 
//You will also have to set whatever non default properties you want, such as text or background color 
[view addSubview:textview]; 
+0

Questo funziona davvero anche se penso che non sia una grande soluzione. Lo contrassegnerò come accettato. Nel tuo codice, dobbiamo anche impostare il testo della nuova vista testo. –

+1

Concordo sul fatto che non si tratta di una soluzione eccezionale, ma non sono sicuro che esista un'altra opzione. Sfortunatamente il tuo problema riguarda due elementi uikit che semplicemente non funzionano come previsto. Animazioni UIView e ridimensionamento della visualizzazione del testo. Quindi devi creare la tua animazione utilizzando NSTimer, e invece di ridimensionare la visualizzazione del testo, devi completamente rifarla con la dimensione desiderata. – Sean

1

Un'altra soluzione è quella di animare il cambiamento limiti.

Ci sono alcuni modi, ma ecco una semplice sottoclasse di UITextView che fa esattamente questo.

import Foundation 
import UIKit 

import QuartzCore 

class SmoothTextView : UITextView { 

    override func actionForLayer(layer: CALayer!, forKey key: String!) -> CAAction! { 

     if key == "bounds" { 

      let x = super.actionForLayer(layer, forKey: "backgroundColor") 

      if let action:CAAnimation = x as? CAAnimation { 

       let transition = CATransition() 

       transition.type    = kCATransitionFade 
       transition.beginTime  = action.beginTime 
       transition.duration   = action.duration 
       transition.speed   = action.speed 
       transition.timeOffset  = action.timeOffset 
       transition.repeatCount  = action.repeatCount 
       transition.repeatDuration = action.repeatDuration 
       transition.autoreverses  = action.autoreverses 
       transition.fillMode   = action.fillMode 

       transition.timingFunction = action.timingFunction 
       transition.delegate = action.delegate 

       return transition 
      } 
     } 

     return super.actionForLayer(layer, forKey: key) 
    } 
} 

Questo come di iOS 8.

Come Tweak in più, si potrebbe desiderare di configurare il testo del testo dell'istanza vista regolando il contenitore di testo azzerando tutte le imbottiture o inserti:

textView.textContainer.lineFragmentPadding = 0.0 
textView.textContainerInset = UIEdgeInsetsZero 
Problemi correlati