Tri*_*ert 3 cocoa rotation nsimageview
所以,我在我的Cocoa应用程序中有这个奇怪的问题.一个工具栏项和一些NSImageViews只是将它们的图像颠倒过来,没有明显的原因.当我因某种原因启动应用程序(图标在代码中分配)时,工具栏项实际上是这样的,然后,当我用取景器缩放效果打开我的HUD时,其中包含的imageViews是颠倒的.

上面的图像是这种奇怪现象的屏障.你可以看到,"显示垃圾"项目奇怪地旋转,HUD中的每个NSImageView,但NSBrowser中的NSImageView很好.
我将如何追踪造成这种情况的原因,然后修复它?
NSG*_*God 13
请参阅Mac OS X开发人员发行说明 - AppKit发行说明(Snow Leopard):
在工具栏中翻转图像(自2009年1月以来的新种子)
一种常见但不正确的做法是调用
setFlipped:YES您计划绘制到翻转图形上下文中的图像.这是不正确的,因为如果稍后将图像绘制到正常的未折叠上下文中,则图像将颠倒显示.但是,Leopard和早期版本中包含一个错误,其中NSToolbarItem(viasetImage:)上设置的图像 会忽略其isFlipped属性.SnowLeopard使用10.6 SDK修复了在SnowLeopard上编译的应用程序的这个错误; 因此,当您的应用程序被重新编译时,一些应该在Leopard中颠倒的图像将开始这样做.如果您在SnowLeopard上重新编译应用程序并发现工具栏项图像是颠倒的,那么它表示您正在
setFlipped:YES代码中的某个位置进行调用.您应该删除这些调用并使用正确处理翻转上下文的方法替换图像绘制.有关更多讨论,请参阅setFlipped:这些发行说明中的讨论.
回覆: setFlipped:
NSImage:弃用 - [NSImage setFlipped:],添加一个尊重上下文翻转的绘图方法(自WWDC 2008以来新增)
被翻转的属性
NSImage被广泛误解.我们正在为SnowLeopard弃用它,并用不太容易出错的API取代它的典型用途.该属性描述了内部坐标系的方向
NSImage.就像超级视图从不关心其子视图的翻转一样,一个用户不NSImage应该关心它的翻转.典型的(有缺陷的)用例是
[image setFlipped:[[NSGraphicsContext currentContext] isFlipped]]在绘图之前尝试调用,但这并不能实现预期的目标.如果在缓存之前调用,则表示最终将缓存缓存,并且翻转被吸收到缓存中.如果在缓存之后调用它,它没有任何效果 - 缓存的表示已经应该包含任何必要的翻转.在前一种情况下,如果在NSImage以后的任何地方绘制它,它会在那个地方倒置,这也是令人困惑的,因为bug和bug的表达相距甚远.对翻转性缺乏了解也常常是性能不佳的代码的来源,在这种代码中,人们制作不必要的中间缓冲区来解决感知到的框架错误.框架的行为符合设计,但与预期相反,语义并不是那么有用.改变语义也很困难-[NSImage isFlipped],因为很多代码都非常依赖于当前的行为.我们已经弃用了该属性,而不是尝试这一点.我们提供了一种简单而正确的方法,可以在翻转或不翻转的上下文中绘制图像,这是一种可以解释上下文翻转的绘制方法.我们还添加了一个匹配提示的提示参数
-bestRepresentationForRect:context:hints:.
- (void)drawInRect:(NSRect)dstRect fromRect:(NSRect)srcRect operation:(NSCompositingOperation)op fraction:(CGFloat)alpha respectFlipped:(BOOL)respectContextIsFlipped hints:(NSDictionary *)hints;通过
YES为respectFlipped获得新奇的行为.对于那些了解CTM并担心此方法具有奇怪交互的人来说,需要注意的一点是,修改CTM可能不会对图像绘制产生任何影响:事实并非如此.此方法基于分支行为[[NSGraphicsContext currentContext] isFlipped].修改CTM可能会使您的轴上下颠倒,但不会改变结果-[NSGraphicsContext isFlipped].他们是完全正交的.第二个有效用途
-[NSImage setFlipped:]是指定通过获得的上下文的翻转-[NSImage lockFocus].有些情况,例如直接绘制NSLayoutManager,需要翻转的上下文.为了涵盖这种情况,我们补充说
- (void)lockFocusFlipped:(BOOL)flipped;这不会改变图像本身的状态,只会改变锁定焦点的上下文.这意味着(0,0)位于左上方,沿着Y轴的正位于锁定上下文中.
| 归档时间: |
|
| 查看次数: |
2295 次 |
| 最近记录: |