2012-11-15 18 views
6

ich eine UITextView haben, und ich versuche, eine Änderung des Rahmens zu animieren, wenn der Benutzer auf eine Schaltfläche tippt. Grundsätzlich ist die Textansicht wird größer auf den Bildschirm passen, damit es mehr Text anzuzeigen, und dann, wenn der Benutzer auf die Schaltfläche tippt wieder schrumpft es in seinen ursprünglichen Rahmen.UITextView Animieren Wechsel Rahmen animieren Text nicht Neuzuteilung

Ich führe die Animation Blöcke verwendet wird, wie folgt aus:

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; 
        }]; 
} 

Wo self.detailView die UITextView ist, und self.detailFrame ist nur ein CGRect den ursprünglichen Rahmen. isDisplayingDetailView ist nur ein BOOL, um zu prüfen, ob die Ansicht erweitert ist oder nicht. Mein Problem ist, dass die Textgröße nicht animiert. Ich habe einige Screenshots aus einer Test-App mein Problem zu veranschaulichen: App Standardansicht: Default view

Die erweiterte Ansicht:

Expanded view

Die Textview nur einen Moment, nachdem die Taste tippen:

Shrinking view

Wie Sie sehen, schrumpft der Text automatisch auf die endgültige Rahmengröße, ohne ein Ki nd der Animation, während die Grenzen noch animieren. Ich denke, das ist das richtige Verhalten, aber ich würde gerne wissen, ob es möglich ist, den Text zusammen mit seiner Ansicht zu animieren.

+0

Hallo, habe u Lösung dieses Problem finden, wenn ja, mit mir bitte teilen, ich bin auch in gleiches Problem –

+0

@VinayakaKarjigi leider stecken, aber ich habe keine Lösung gefunden. –

+0

hatte das gleiche Problem. Meine Lösung bestand darin, ein Bild der Textansicht zu rendern, wo es die Textansicht war, die Textansicht auszublenden und dann das Bild zu animieren. – peko

Antwort

2

Der Text in Textviews nicht immer wie erwartet verhalten. Dazu müssen Sie einen NSTimer einrichten und die Framegröße für jeden Tick setzen.

Sie so etwas wie:

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

Dann, wenn es fertig ist ich vollständig das Textview von Superview entfernen würde und es auf Null gesetzt, und dann init einen neuen. Der Grund dafür ist, dass bei Änderungen der Rahmen von Textansichten aus irgendeinem Grund das Padding um das Textfeld herum hinzugefügt wird. Sie werden es nicht bemerken, wenn Sie den Rahmen nicht wahrscheinlich um mindestens 100 Mal ändern.

[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

Das funktioniert tatsächlich obwohl ich denke, es ist keine großartige Lösung. Ich werde es als akzeptiert markieren. In Ihrem Code müssen wir auch den Text der neuen Textansicht festlegen. –

+1

Ich stimme zu, dass es keine großartige Lösung ist, aber ich bin mir nicht sicher, ob es eine andere Option gibt. Unglücklicherweise beinhaltet dein Problem zwei uikit-Elemente, die einfach nicht wie erwartet funktionieren. UIView-Animationen und Größenanpassung von Textansichten Sie müssen also Ihre eigene Animation mit NSTimer erstellen, und anstatt die Textansicht zu skalieren, müssen Sie sie komplett in der gewünschten Größe neu erstellen. – Sean

1

Eine andere Lösung ist die Änderung der Grenzen zu ändern.

Es gibt ein paar Möglichkeiten, aber hier ist eine einfache Unterklasse von UITextView was tut genau dies.

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) 
    } 
} 

dies als iOS 8.

Als zusätzliche zwicken, möchten Sie vielleicht durch Einstellen des Textcontainers den Text Ihrer Textansicht Instanz konfigurieren durch Nullsetzen aller Polsterung oder Einlässe:

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