2012-11-15 11 views
6

Mam UITextView i próbuję animować zmianę klatki, gdy użytkownik dotknie przycisku. Zasadniczo widok tekstowy powiększa się, aby pasował do ekranu, dzięki czemu może wyświetlać więcej tekstu, a następnie, gdy użytkownik ponownie dotknie przycisku, kurczy się do pierwotnej ramki.UITextView animowana zmiana ramki nie animuje realokacji tekstu

mi wykonać animację przy użyciu bloków, jak to:

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

Gdzie self.detailView jest UITextView i self.detailFrame tylko CGRect posiadających oryginalną ramkę. isDisplayingDetailView to tylko BOOL, aby sprawdzić, czy widok jest rozwinięty czy nie. Moim problemem jest to, że zmiana rozmiaru tekstu nie jest animowana. Zrobiłem kilka screenów z app testu do zilustrowania mój problem: App widok domyślny: Default view

Poszerzony widok:

Expanded view

TextView tylko chwila po dotknięciu przycisku:

Jak widać tekst automatycznie kurczy się do ostatecznego rozmiaru klatki, bez żadnego ki nd animacji, podczas gdy granice nadal są animowane. Zgaduję, że to właściwe zachowanie, ale chciałbym wiedzieć, czy możliwe jest animowanie tekstu wraz z jego widokiem.

+0

Witam, Czy znalazłeś rozwiązanie tego, jeśli tak, proszę, podziel się ze mną, ja też utknąłem w tym samym problemie –

+0

@VayayakaKarjigi przepraszam, ale nie znalazłem rozwiązania. –

+0

miał ten sam problem. moim rozwiązaniem było renderowanie obrazu z widoku tekstowego, umieszczenie go tam, gdzie był widok tekstowy, ukrycie widoku tekstowego, a następnie animacja obrazu. – peko

Odpowiedz

2

Tekst w poglądach tekstowych nie zawsze działa zgodnie z oczekiwaniami. W tym celu musisz ustawić NSTimer i ustawić rozmiar klatki na każdym tiku.

zrobić coś takiego:

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

Potem, kiedy to zrobić bym całkowicie usunąć TextView z SuperView i ustawić go do zera, a następnie startowych na nową. Powodem tego jest to, że po zmianach ramki tekstów z niektórych powodów dopełniają pole tekstowe. Nie zauważysz tego, chyba że zmienisz ramkę prawdopodobnie co najmniej 100 razy.

[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

To faktycznie działa, chociaż uważam, że to nie jest świetne rozwiązanie. Zaznaczę to jako zaakceptowane. W twoim kodzie musimy również ustawić tekst nowego widoku tekstowego. –

+1

Zgadzam się, że to nie jest świetne rozwiązanie, ale nie jestem pewien, czy jest jakaś inna opcja. Niestety twój problem dotyczy dwóch elementów uikit, które po prostu nie działają zgodnie z oczekiwaniami. UIView animacje i zmiana rozmiaru tekstu. Więc musisz zrobić własną animację wykorzystującą NSTimer, a zamiast zmieniać rozmiar tekstu, musisz całkowicie przerobić go na pożądany rozmiar. – Sean

1

Innym rozwiązaniem jest animacja zmiany granic.

Istnieje kilka sposobów, ale oto prosta podklasa UITextView, która robi dokładnie to.

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

to jako iOS 8.

jako dodatkowy uszczypnąć, możesz skonfigurować tekst tekst widok przykład poprzez dostosowanie kontener tekstu przez zerowanie wszystkich wyściółkę lub wypustkami:

textView.textContainer.lineFragmentPadding = 0.0 
textView.textContainerInset = UIEdgeInsetsZero 
Powiązane problemy