7

UITextViewがあり、ユーザーがボタンをタップしたときのフレームの変更をアニメーション化しようとしています。基本的に、テキストビューは画面に合わせて大きくなり、より多くのテキストを表示できるようになります。その後、ユーザーがボタンをもう一度タップすると、元のフレームに縮小されます。

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

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

ここで、self.detailViewはUITextViewであり、self.detailFrameは元のフレームを保持する単なるCGRectです。isDisplayingDetailViewは、ビューが展開されているかどうかを確認するための単なるブール値です。私の問題は、テキストのサイズ変更がアニメーション化されていないことです。問題を説明するために、テストアプリからいくつかのスクリーンショットを作成しました。アプリのデフォルトビュー: デフォルトビュー

拡大図:

拡大図

ボタンをタップした直後のテキストビュー:

縮小ビュー

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

4

2 に答える 2

2

textviewsのテキストは、常に期待どおりに機能するとは限りません。このためには、NSTimerを設定し、ティックごとにフレームサイズを設定する必要があります。

次のようなことをします:

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

次に、それが完了したら、スーパービューからテキストビューを完全に削除してnilに設定し、新しいものを初期化します。これは、何らかの理由でテキストビューのフレームを変更すると、テキストのボックスの周囲にパディングが追加されるためです。おそらく少なくとも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];
于 2013-05-31T19:52:38.773 に答える
1

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

いくつかの方法がありますが、UITextViewこれを正確に実行する単純なサブクラスを次に示します。

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

これはiOS8以降です。

追加の調整として、すべてのパディングまたはインセットをゼロにしてテキストコンテナを調整することにより、テキストビューインスタンスのテキストを構成することをお勧めします。

textView.textContainer.lineFragmentPadding = 0.0
textView.textContainerInset = UIEdgeInsetsZero
于 2015-04-16T20:11:53.383 に答える