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

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

展开的视图:

扩大了视野

点击按钮后的文本视图:

缩小观点

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

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

另一种解决方案是为边界变化设置动画。

有几种方法,但这里是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