主要的NSTextView轮换问题

时间:2013-09-04 19:29:25

标签: objective-c macos core-animation nsview nstextview

请耐心等待我,因为这几天令我感到沮丧。这似乎应该非常简单,但由于某种原因,我一直遇到一系列令人沮丧的问题。我过去在iOS上做过更多的工作,从来没有遇到过我在OS X上遇到的这类问题。我想知道我是不是在理解AppKit中的视图架构的基础知识。特别是,我不太熟悉层支持视图和普通视图之间的交互,因为我之前不需要在OS X上制作任何动画(因为iOS默认情况下会使所有视图都支持层)。

无论如何,我在尝试将NSTextView对象旋转45度时遇到了一些重大问题。该文本适用于放置在较大的自定义NSView子类中的某些标签,但大多数标签似乎与此特定问题无关。我将通过我尝试过的和我遇到的问题。标签的位置基本上是静态的,所以我不关心它们是否可动画。需要以编程方式创建和放置标签,而不是IB,因为它们的大小和位置取决于动态生成的数据。如果重要,NSTextViews正在使用属性字符串。

1)我首先以对我来说最直接的方式做到这一点,这只是为NSTextView标签设置框架,将它们作为子视图添加到图形对象,然后在它们上面调用[labelTextView setFrameRotation:45]。这在Mountain Lion上完美运行,但是当我在Lion上测试它时,在屏幕上绘制的标签高度会神秘地增加(即使我之后记录框架它没有变化)。这是不可接受的,因为我需要它为标签绘制背景颜色,以便在叠加到图表上时看起来可读。所以在Lion上,setFrameRotation中有一个bug或类似的东西应用于NSTextView(或者看起来似乎如此)。有谁知道这是怎么回事?它在10.8上正常工作但在10.7上没有正常工作。 SetFrameCenterRotation也有同样的问题。使视图层支持与否,似乎没有任何区别。

2)我接下来尝试使用CATransform3DMakeRotation,在创建父视图和NSTextView层支持之后。我使用了行labelTextView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1.0);,但是当我这样做时,文本视图不会旋转。作为测试,我尝试使用带有彩色背景的普通NSView进行相同的操作,并且它可以正确旋转。有没有人知道为什么这不适用于NSTextView?

3)我尝试将NSTextView包含在NSView容器中,然后在其上调用setFrameRotation。这确实正确地旋转它,但不知何故在Core Animation中触发无限递归,它会快速消耗千兆字节的RAM,除非我杀死进程!关于那里发生了什么的任何想法?!?

4)我尝试使用Autolayout来定位标签并通过设置框架手动定位它们。结果没有任何差异。

5)我可以使用完全自定义绘图来完成此操作,但在这种特殊情况下,这将是很多工作。我宁愿不这样做只是为了支持10.7。我也可以尝试NSTextField来看看它是否在第1部分中遇到了同样的问题,但这会很烦人,因为我想要NSTextView的一些功能(这不仅仅是单行的文本blob)。

我在这里做错了什么?我从来没有想过这么简单,因为很难在10.7 + 10.8上正常工作。

更新: 我尝试用NSTextField代替NSTextView并且3)中的问题消失了(段落样式并不完全是我想要的,但我可以修复它)。关于为什么NSTextView在NSTextField显然没有旋转的问题上有任何想法?这对我来说似乎很疯狂。我将在没有容器的情况下尝试NSTextField以查看它是否也受到Lion上绘图故障的影响。

更新2: 我尝试使用NSTextField代替NSTextView并旋转它,这对Lion和Mountain Lion也完全没问题。旋转后文本视图大小发生变化的视觉故障也会消失。所以我想答案是,NSTextView完全无法在不触发多个错误的情况下旋转其帧(特别是在旧版本的OS X上)。如果是这种情况,并且NSTextView不打算以这种方式使用,Apple的文档应该这样说。任何人都可以确认是这种情况吗?

0 个答案:

没有答案