19

当我对 a 应用旋转变换UITextView然后单击内部开始编辑时,似乎内容大小会自动变宽。内容视图的新宽度是旋转视图边界框的宽度。例如,给定一个宽度为 500 和高度为 400 的文本框,并旋转 30 度,新的内容宽度将是:

(500 * cos(30)) + (400 * sin(30)) = 633

或以图形方式:

在此处输入图像描述

有趣的是,如果您已经在编辑文本视图然后应用转换,那么似乎没有对内容大小进行任何修改。因此,似乎在文本编辑开始的某个时候,文本视图会查看其frame属性并根据框架宽度调整内容大小。我想解决方案是告诉它使用该bounds属性,但是我不知道在哪里执行此操作,因为我不确定文本视图决定修改内容大小的确切位置。

我用谷歌搜索,但似乎找不到任何关于使用转换后的 UITextViews 的参考。有人对此有任何想法吗?

编辑(来自测试项目的按钮操作):

- (IBAction)rotateButtonTapped:(id)sender {
    if (CGAffineTransformIsIdentity(self.textView.transform)) {
        self.textView.transform = CGAffineTransformMakeRotation(30.0 * M_PI / 180.0);
    }
    else {
        self.textView.transform = CGAffineTransformIdentity;
    }

    NSLog(@"contentsize: %.0f, %.0f", textView.contentSize.width, textView.contentSize.height);
}
4

2 回答 2

24

我也被这个问题困住了。

我发现的唯一解决方案是创建一个 UIView 实例并将 UITextView 添加为子视图。然后你可以旋转 UIView 和 UITextView 的实例就可以了。

UITextView *myTextView = [[UITextView alloc] init];
[myTextView setFrame:CGRectMake(0, 0, 100, 100)];

UIView *myRotateView = [[UIView alloc] init];
[myRotateView setFrame:CGRectMake(20, 20, 100, 100)];
[myRotateView setBackgroundColor:[UIColor clearColor]];
[myRotateView addSubview:myTextView];

myRotateView.transform = CGAffineTransformMakeRotation(0.8);
[[self view] addSubview:myRotateView];
于 2012-02-08T15:21:17.807 回答
1

您是否尝试过通过图层变换而不是视图上的变换来应用旋转?

#import <QuartzCore/QuartzCore.h>

mytextField.layer.transform = CATransform3DMakeRotation (angle, 0, 0, 1);

这可能足以欺骗核心文本字段代码中存在的任何损坏的逻辑。

于 2011-09-23T05:20:51.823 回答