2012-11-15 5 views
6

私はUITextViewを持っています。ユーザーがボタンをタップしたときにフレームの変更をアニメートしようとしています。基本的に、テキスト表示は画面に合わせて大きくなり、より多くのテキストを表示することができ、ユーザーがボタンを再びタップすると元のフレームに縮小されます。UITextViewアニメーションによるフレームの変更で、テキストの再配置がアニメートされない

は、私はこのように、ブロックを使用してアニメーションを実行します。

self.detailViewはUITextViewで、self.detailFrameだけのオリジナルのフレームを保持CGRectある
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; 
        }]; 
} 

。 isDisplayingDetailViewは、ビューが展開されているかどうかをチェックする単なるBOOLです。 私の問題は、テキストのサイズ変更がアニメーション化されていないことです。私は私の問題を説明するために、テストアプリからいくつかのスクリーンショットをした: アプリケーションのデフォルトビュー: Default view

拡大図:

Expanded view

のTextViewボタンをタップした後ちょっと:

Shrinking view

ご覧のとおり、テキストは自動的に最終フレームサイズに縮小されます境界線はまだアニメーション化されています。私はそれが正しい行動だと思いますが、テキストをアニメーション表示することが可能かどうかを知りたいと思います。

+0

こんにちは、あなたは私と共有してください、私も同じ問題に固執している場合は、この解決策を見つけました –

+0

@VinayakaKarjigi申し訳ありませんが、解決策は見つかりませんでした。 –

+0

にも同じ問題がありました。私の解決策は、textviewのイメージをレンダリングし、textviewの場所に配置し、textviewを非表示にしてからイメージをアニメーション化することでした。 – peko

答えて

2

textviewsのテキストが、必ずしも期待どおりに動作するとは限りません。このためには、NSTimerを設定し、毎回フレームサイズを設定する必要があります。

ような何か:それは完了だときに、私は完全に新しいものにinitその後、スーパービューからのTextViewを削除し、ゼロに設定し、そしてだろう

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

を。これは、何らかの理由でテキストビューのフレームが変更されたときに、テキストボックスの周囲にパディングが追加されるためです。フレームをおそらく少なくとも100回変更しない限り、気付かないでしょう。

[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

これは実際にはうまくいきますが、私はそれが素晴らしい解決策ではないと思います。私はそれを受け入れたものとしてマークします。あなたのコードでは、新しいテキストビューのテキストも設定する必要があります。 –

+1

私はそれが素晴らしい解決策ではないことに同意しますが、他の選択肢があるかどうかはわかりません。残念ながら、あなたの問題には期待通りに機能しない2つのuikit要素が含まれています。 UIViewのアニメーションとテキストビューのサイズ変更。ですから、NSTimerを利用して独自のアニメーションを作成しなければならず、テキストビューのサイズを変更するのではなく、目的のサイズで完全にリメイクする必要があります。 – Sean

1

もう1つの解決策は、境界の変化をアニメーション化することです。

いくつかの方法がありますが、正確にはこれを行うUITextViewという単純なサブクラスがあります。

のiOS 8のよう
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) 
    } 
} 

この

余分な微調整として、あなたはすべてのパディングやインセットをゼロにすることにより、テキストコンテナを調整することで、あなたのテキスト・ビュー・インスタンスのテキストを設定することをお勧めします:

textView.textContainer.lineFragmentPadding = 0.0 
textView.textContainerInset = UIEdgeInsetsZero 
関連する問題