请耐心等待,因为这几天让我很沮丧。这看起来应该很简单,但由于某种原因,我一直遇到一系列令人沮丧的问题。过去我在 iOS 上做了更多的工作,但从来没有遇到过我在 OS X 上遇到的这类问题。我想知道我是否不了解 AppKit 中视图架构的基本知识。特别是,我对 layer-backed 视图和普通视图之间的交互不是很熟悉,因为我以前不需要在 OS X 上为任何东西制作动画(而且因为 iOS 默认情况下所有视图都是 layer-backed)。
无论如何,我在尝试将 NSTextView 对象旋转 45 度时遇到了一些重大问题。文本用于放置在更大的自定义 NSView 子类中的一些标签,但其中大部分似乎与这个特定问题无关。我会经历我尝试过的和遇到的问题。标签的位置基本上是静态的,所以我不关心它们是否可动画。标签需要以编程方式创建和放置,而不是来自 IB,因为它们的大小和位置取决于动态生成的数据。如果重要的话,NSTextViews 正在使用属性字符串。
1)我首先以对我来说似乎最简单的方式执行此操作,即简单地为 NSTextView 标签设置框架,将它们作为子视图添加到图形对象,然后调用[labelTextView setFrameRotation:45]
在他们。这在 Mountain Lion 上效果很好,但是当我在 Lion 上测试它时,在屏幕上绘制的标签高度神秘地增加了(即使我之后记录框架时它没有改变)。这是不可接受的,因为我需要它为标签绘制背景颜色,以便在叠加到图形上时看起来可读。因此,在 Lion 上,setFrameRotation 中有一个错误或某些东西应用于 NSTextView (或者看起来如此)。有谁知道这是怎么回事?它在 10.8 上正常工作但在 10.7 上不能正常工作,这很烦人。SetFrameCenterRotation 也有同样的问题。使视图层支持或不支持似乎没有区别。
2)我接下来尝试使用 CATransform3DMakeRotation 来执行此操作,在制作父视图和 NSTextView 图层支持之后。我使用了 line labelTextView.layer.transform = CATransform3DMakeRotation(M_PI_4, 0, 0, 1.0);
,但是当我这样做时文本视图不会旋转。作为测试,我使用带有彩色背景的普通 NSView 尝试了同样的事情,它确实可以正确旋转。有谁知道这不适用于 NSTextView 的可能原因?
3)我尝试将 NSTextView 封闭在 NSView 容器中,然后在其上调用 setFrameRotation 。这确实可以正确旋转它,但会以某种方式触发核心动画中的无限递归,除非我终止进程,否则会迅速消耗千兆字节的 RAM!再说一次,关于那里发生了什么的任何想法?!?
4)我尝试了所有这些使用自动布局来定位标签并通过设置它们的框架来手动定位它们。无论哪种方式,结果都没有差异。
5)我可以使用完全自定义的绘图来做到这一点,但在这种特殊情况下,这将是很多工作。我宁愿不这样做只是为了支持 10.7。我也可以尝试 NSTextField 看看它是否在第 1 部分中遇到同样的问题,但这会很烦人,因为我想要 NSTextView 的一些功能(这不仅仅是单行文本块)。
我在这里做错了什么?我从来没有想过这么简单的事情在 10.7 + 10.8 上很难正常工作。
更新:我尝试用 NSTextField 代替 NSTextView 并且 3) 中的问题消失了(段落样式还不是我想要的,但我可以解决这个问题)。关于为什么 NSTextView 在 NSTextField 显然没有旋转的地方有这样的问题的任何想法?这对我来说似乎很疯狂。我将在没有容器的情况下尝试 NSTextField,看看它是否也受到 Lion 上的绘图故障的影响。
更新 2:我尝试只使用 NSTextField 而不是 NSTextView 并旋转它,这在 Lion 和 Mountain Lion 上也完全正常。旋转后文本视图大小发生变化的视觉故障也消失了。所以我想答案是 NSTextView 完全无法在不触发多个错误的情况下旋转其框架(尤其是在旧版本的 OS X 上)。如果是这种情况,并且 NSTextView 不打算以这种方式使用,Apple 的文档可能应该这样说。任何人都可以确认是这样吗?