2

나는 모든 UIView 개체가 cocos2d 노드를 따르도록 뷰 변환을했습니다. enter image description hereUIView에서 NSView로 작동하는 뷰 변환을 적용하는 방법은 무엇입니까?

지금 Mac 용 내가 먼저 내가적인 Cocos2D의 OpenGL을 위에 NSView의 객체를 그리기 위해 제대로 오버레이 NSWindow 표시 설정이 있는지 확인하십시오있는 UIButton이 Box2D의 본문을 다음 예에서, iOS에서 잘 작동 전망.

enter image description here

을하지만 내가 NSViews에 대한 [NSView setTransform:..] 방법이 없다는 것을 알게 : 그건 NSButton이 경우처럼 작동합니다. 이것이 Mac에서 작동하는 방법인지 모르겠지만 여기에 내가 한 일이 있습니다.

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

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

레이어가 아닌 것으로 확인되었습니다. 또한 setWantsLayer를 활성화 한 후에 NSView가 그려지는지 다시 확인했습니다. 그 결과가 조금이라도 오프셋 또는 미러링하지 않는 것, 버튼이 아무데도 전체 창에서 볼 수, 실망, 그것은 더 이상 그냥 거기 :

enter image description here

이가 나를 데리고 온다 변환 코드. 앞에서 말했듯이 이것은 iOS와 같은 코드입니다 (마지막에 변환을 지정하는 것을 제외하고). 그것은 iOS (모든 방향에서도)에서 완벽하게 작동하지만 더 이상 NSView 객체를 전혀 볼 수없는 NSView 객체가있는 Mac OS X에서는 작동하지 않습니다.

나는 무엇이 잘못 될 수 있을지 모르겠다. 아마도 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에 적용합니다. 나는 다음 솔루션을 디버깅하는 방법에 대한 몇 가지 팁을 주시면 감사하겠습니다. 감사!

는 업데이트 :

나는 레이어의이 어떻게되는지 작은 값으로 변환 변화하는 주위를 연주하기 시작했다.

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

천천히 움직이는 NSButton의 효과. 그것은 위로 오른쪽으로 이동 유지하지만, 뷰 프레임의 경계 RECT에서 사라 :

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

일종의 작품이지만 큰 단점이 있습니다. 수퍼 뷰는 메인 윈도우와 같은 크기의 오버레이 윈도우입니다. 왜냐하면 어떤 이유에서든 contentView에서 레이어지지를 사용하면 모든 사용자 입력을 사용할 수 없게됩니다. 창 안쪽뿐만 아니라 창 x + - 아이콘도 있습니다 (이것은 창 크기가 너무 크기 때문일 수 있습니다). 또한 흥미로운 점은 오버레이 윈도우의 contentView가 레이어 기반이지만 서브 뷰가없는 경우보기 (버튼)가 추가 될 때까지 프레임 속도가 30fps로 느려집니다. 그래도 500 포인트를받을 자격이 있습니다. ;) – LearnCocos2D

+0

NSView의 - (void) setFrameRotation : (CGFloat) angle 또는 - (void) setFrameCenterRotation : (CGFloat)을 사용하여 윈도우의 contentView를 레이어 백킹하는 대신에 회전이 필요한 경우 기존의 메서드를 사용하여 뷰를 회전하는 방법을 사용할 수 있습니다.)각도. NSControl 인 경우 객체의 클래스를 확인하고 그런 식으로 회전 할 수 있습니다. – Jorge

관련 문제