我想有像Adobe Illustrator一样的可旋转的文本编辑区域。我尝试了几种方法,包括子类化NSTextView和在绘制代码之前添加坐标系旋转,如下所示:
@implementation MyNSTextView
-(void)drawRect:(NSRect)dirtyRect
{
NSAffineTransform * trafo = [NSAffineTransform transform];
[trafo rotateByDegrees:45];
[trafo concat];
[super drawRect:dirtyRect];
}
-(void)drawInsertionPointInRect:(NSRect)rect color:(NSColor *)color turnedOn:(BOOL)flag
{
NSAffineTransform * trafo = [NSAffineTransform transform];
[trafo rotateByDegrees:45];
[trafo concat];
[super drawInsertionPointInRect:rect color:color turnedOn:flag];
}这导致文本的显示被破坏。我还尝试通过对NSView进行子类化并以编程方式组装文本体系结构来实现该功能。我使用NSLayoutManager的drawGlyphsForRange:方法绘制字符串。这在一定程度上是可行的,但会变得复杂,因为我必须旋转绘图的坐标,并且为了处理鼠标单击,我必须将鼠标位置转换回旧的坐标。
那么,这是最好的方法吗?还是有其他方法?
编辑:我现在尝试这样使用CALayer:
@implementation MyNSTextView
-(id)initWithFrame:(NSRect)frameRect
{
self = [super initWithFrame:frameRect];
if (self) {
CALayer *myLayer = [CALayer layer];
myLayer.transform = CATransform3DMakeRotation(1.6,1,0,1.0);
[self setLayer:myLayer];
[self setWantsLayer:YES];
}
return self;
}但这会产生一个不显示任何文本(只显示一个光标)且不旋转的TextView。还有没有其他东西可以让它正常工作??
发布于 2012-06-13 16:22:39
你把事情搞得太复杂了。只需在视图本身上设置旋转:
[myView setFrameRotation:angleInDegrees];也有setFrameCenterRotation,但它应该只适用于支持层的视图(这是可以的)。
有一个警告,我自己还在调查:当视图旋转时,闪烁的文本光标变得非常胖。
发布于 2011-06-15 11:50:51
为什么不让视图分层呢?然后,您可以只将仿射变换应用于视图的图层。
yourView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1.0);发布于 2011-06-15 11:53:25
问题是您正在创建一个NSAffineTransform,但是没有将它附加到您的文本视图。
https://stackoverflow.com/questions/6342937
复制相似问题