UITextView动画更改框架不会动画文本重新分配

时间:2012-11-15 17:29:53

标签: ios uitextview uiviewanimation

我有一个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只是一个BOOL,用于检查视图是否展开。 我的问题是文本调整大小不是动画。我从测试应用程序中制作了一些截图来说明我的问题: 应用默认视图: Default view

展开的观点:

Expanded view

点按按钮后的文字视图:

Shrinking view

正如您所看到的,文本会自动缩小到最终的帧大小,没有任何类型的动画,而边界仍然是动画。我想这是正确的行为,但我想知道是否可以为文本设置动画及其视图。

2 个答案:

答案 0 :(得分:2)

textview中的文字并不总是按预期运行。为此,您必须设置NSTimer并在每个刻度上设置帧大小。

做类似的事情:

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

然后当它完成后,我将从superview中删除textview并将其设置为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];

答案 1 :(得分: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)
    }
}

从iOS 8开始。

作为额外的调整,您可能希望通过将所有填充或插入调零来调整文本容器来配置文本视图实例的文本:

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