2

我有一个禁用滚动的 UITextView,我正在使用页面卷曲转换来更改里面的文本。这是我正在使用的代码:

myView.text = nextString;

[UIView transitionWithView:myView duration:PAGE_CURL_DURATION options:UIViewAnimationOptionTransitionCurlDown animations:nil completion:nil];

一切正常,除非新文本字符串的行数比旧文本字符串多,否则它将被剪裁,直到动画完成。看起来 contentSize 在动画之后发生了变化。我尝试添加myView.contentSize = myView.bounds.size;,但这并没有改变任何东西。我还关闭了“剪辑子视图”,但无济于事。

这是动画之后的样子: 替代文字

片刻之后,文本不再被剪裁。

任何想法如何防止剪辑?

4

3 回答 3

2

简单的方法是按照 Bjarne 所说的去做 - 使用 clipsToBounds 属性。但请注意 - 这会使文本无限向下扩展。因此,您还需要用一个容器视图包围您的文本字段,该容器视图确实剪辑到边界以设置上限。

如果这不起作用,您将不得不做一些工作来手动扩展文本视图的边界并在新文本较大时在动画之前重新定位它。

要获取文本的大小,请查看 UIKit 框架中的 UIStringDrawing.h。具体来说,我正在考虑使用: - (CGSize)sizeWithFont:(UIFont *)font forWidth:(CGFloat)width lineBreakMode:(UILineBreakMode)lineBreakMode; 与 UILineBreakModeWordWrap 一起使用。

获取大小的另一种方法可能是 UILabel 中的这个函数: - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines; 并传入最大可能文本视图的边界。

为了获得额外的功劳,您可能还需要考虑对视图边界的变化进行动画处理,以实现更平滑的过渡。

于 2010-07-30T14:23:42.440 回答
0

这很奇怪。contentSize不应剪辑内容,而仅确定滚动行为。然而,这是从动画前到动画后的唯一变化。并且取消选中剪辑子视图总是对我有用。

几个选项:

我假设您UITextView.frame的内容足够大,最初可以包含两个文本中最大的一个?如果您在动画开始之前设置它,您可能为时已晚。在这种情况下,诸如创造奇迹之类的技巧[self performSelector(continueWithStuff:) withObject:object afterDelay:0.01],因为在动画确定初始状态之前,您需要给 UI 时间来实现您的更改。

但到目前为止,最简单的解决方法是为每个文本添加一堆换行符。由于您无论如何都没有滚动,所以这应该不是问题。

另一个角度可能是将您嵌入UITextView其中UIView然后制作动画。阅读文档,view参数应该是“包含转换中涉及的视图的容器视图”。忽略这个事实可能会给您带来令人惊讶的结果。

于 2010-07-26T16:05:39.723 回答
0

解决问题的最简单方法是将 UITextView 的属性“clipsToBounds”设置为 NO。这将使您的文本视图可以在其边界之外绘制

于 2010-07-28T18:21:49.857 回答