将转换应用于UITextView - 防止内容调整大小

时间:2011-06-25 18:26:32

标签: ios rotation uitextview transform cgaffinetransform

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

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

或图形化:

enter image description here

有趣的是,如果您已经在编辑文本视图并且然后应用了转换,那么似乎没有对内容大小进行修改。因此,在文本编辑开始的某个时候,文本视图会查看其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);
}

2 个答案:

答案 0 :(得分:22)

我也遇到了这个问题。

我找到的唯一解决方案是创建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];

答案 1 :(得分:1)

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

#import <QuartzCore/QuartzCore.h>

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

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