2013-04-14 67 views
2

我有一個視圖轉換,使任何UIView對象跟隨一個cocos2d節點。做工精細iOS上,在這個例子中的UIButton遵循其Box2D的身體:如何將適用於UIView的視圖轉換應用於NSView?

enter image description here

現在的Mac我第一次驗證了我正確的有覆蓋NSWindow設置,以借鑑的cocos2d OpenGL上的一個NSView對象視圖。這樣的作品,因爲在這種情況下,與NSButton:

enter image description here

但後來我瞭解到,有是NSViews沒有[NSView setTransform:..]方法。我不確定這是如何在Mac上運行,但這是我做的:

// sometime after initializing the view 
[nsView setWantsLayer:YES]; 

// every time I update transform: 
nsView.layer.affineTransform = transform; 

我驗證該圖層非零。我還重新驗證了NSView是在啓用setWantsLayer之後繪製的。結果是令人失望的,按鈕是無處整個窗口上看到,這並不甚至似乎略微偏移或鏡像,它只是不存在了:

enter image description here

這使我的轉換代碼。正如我所說的,這與iOS的代碼相同(除了最後指定轉換)。它可以在iOS上完美工作(也可以在任何方向),但不能在Mac OS X上使用NSView對象,在那裏我根本看不到NSView對象。

我不確定這裏可能會出現什麼問題,也許CALayer的工作方式不同,也許我只是做了一個非常愚蠢而明顯的錯誤。我什麼都找不到。

KKAppDelegate* ad = (KKAppDelegate*)[KTApplication sharedApplication].delegate; 
float windowHeight = ad.window.frame.size.height; 

float x = _position.x - _contentSize.width * _anchorPoint.x; 
float y = windowHeight - (_position.y + _contentSize.height * _anchorPoint.y); 

if (_ignoreAnchorPointForPosition) 
{ 
    x += _anchorPointInPoints.x; 
    y += _anchorPointInPoints.y; 
} 

float cx = 1, sx = 0, cy = 1, sy = 0; 
if (_rotationX || _rotationY) 
{ 
    float radiansX = CC_DEGREES_TO_RADIANS(_rotationX); 
    float radiansY = CC_DEGREES_TO_RADIANS(_rotationY); 
    cx = cosf(radiansX); 
    sx = sinf(radiansX); 
    cy = cosf(radiansY); 
    sy = sinf(radiansY); 
} 

CGAffineTransform transform = 
    CGAffineTransformMake(cy * _scaleX, sy * _scaleX, 
          -sx * _scaleY, cx * _scaleY, x, y); 

#if KK_PLATFORM_IOS 
    _cocoaView.transform = transform; 
#elif KK_PLATFORM_MAC 
    _cocoaView.layer.affineTransform = transform; 
#endif 

我證實了代碼運行和x/y值是可以預期的(即沒有負面的位置或瘋狂的值)。在第一步中甚至沒有執行旋轉,但在第一幀的變換&繪製之後仍然看不到NSView。

我是CALayer總數n00b並將轉換應用到NSView。我會很感激,如果不是解決方案,然後一些提示如何調試。謝謝!

UPDATE:

我開始改變層的小值變換看個究竟玩耍。

CGAffineTransform transform = _cocoaView.layer.affineTransform; 
transform = CGAffineTransformTranslate(transform, 0.1, 0.1); 
_cocoaView.layer.affineTransform = transform; 

這個效果是一個緩慢移動的NSButton。它不停地向上移動,並在右邊,但它消失在視圖幀的邊界矩形:

enter image description here

所以我相信我在這裏的問題是,視圖不會改變,只是層 - 當我轉換圖層會快速將視圖的內容繪製到圖層邊界之外,因此不再顯示任何內容。

我是否有權假定我必須直接改變視圖的屬性呢?文件也強調了這一點。在這一點上,我只是不知道如何將轉換應用於視圖(即我回到了原點)。我嘗試手動設置旋轉和框架原點,但這樣我無法將旋轉中心與cocos2d節點的中心(anchorPoint)對齊。

回答

3

UIButtonNSButton之間有一個重要的區別。即使NSButton最後是NSView的子類,NSButton的渲染也是通過其單元格NSButtonCell完成的。單元格創建爲NSView的「更輕」版本。作爲蘋果公司的文檔狀態:

的的NSCell類提供了不完整的NSView子類的開銷 顯示文本或圖像的對象的NSView的機制。它的 大部分NSControl類被用於實現其內部工作 。

雖然這在Mac OS X早期很有用,但現在已不再是這種情況了,希望蘋果在某個階段改變AppKit。

發生在你身上的是單元格被旋轉了,但它被視圖剪切了,在你的情況下是按鈕本身。

爲了解決這個問題,使NSButton的上海華層背過了,我相信,裁剪就會消失:

[nsView.superview setWantsLayer:YES]; 
+0

謝謝,我會給予一個鏡頭。 – LearnCocos2D

+0

這類工作但有一個很大的缺點:由於superview是一個與主窗口大小相同的覆蓋窗口,出於某種原因在其contentView上啓用層支持會禁用所有用戶輸入。不僅僅在窗口內部,而且還包括窗口的x + - 圖標(這可能是因爲窗口實際上太大)。另外有趣的是:如果覆蓋窗口的contentView是分層支持的,但沒有子視圖,則會減慢幀率到30 fps,直到添加視圖(按鈕)。不過,你應該得到500分。 ;) – LearnCocos2D

+0

如果你只需要旋轉,那麼對層次支持窗口的contentView的替代方法是使用NSView的 - (void)setFrameRotation:(CGFloat)角度或 - (void)setFrameCenterRotation :(CGFloat )角度。你可以檢查對象的類,並且如果它是NSControl,就可以這樣旋轉它。 – Jorge

相關問題