setScale:方法不适用于iPad专业版?

时间:2016-10-15 19:40:08

标签: ios cocos2d-iphone

我有一个适用于视网膜iPad和iPhone的cocos2d应用程序,我刚刚出去买了一个iPad专业版,以确保它正常工作,果然,大量的东西显示不正确。

在做了一些调试之后,我确定它是因为许多元素的比例为0 ......所以我做了一些调试,例如我的代码中有一行代码:

self.scale = 1.0f;

如果我在该行上放置一个断点,然后进入我的类从CCNode继承的setter函数:

-(void) setScale:(float) s
{
    _scaleX = _scaleY = s;
    _isTransformDirty = _isInverseDirty = YES;
}

然后..然后在调试器中我看看_scaleX和_scaleY ivars设置为:

(lldb) expr s
(float) $0 = 0

什么?!?!?!?!?!?!?!?世界上如何将1.0传递到此函数并变为0 ???为什么iPad专业人士无视计算机科学的所有法则?

如果我在视网膜iPad或iPhone 5或iPhone 6或iPhone 6 plus上做同样的事情,比例为1.0,而不是0。

1 个答案:

答案 0 :(得分:0)

哇......所以,原因是这个对象被用于协议:

// stuff...

[self.menuItems enumerateObjectsUsingBlock:^(CCNode<MenuInteractable> *menuItem, NSUInteger idx, BOOL *stop) {
  maxMenuItemSize     = CGSizeMake(maxMenuItemSize.width, maxMenuItemSize.height * menuItem.scale);

// more stuff..

该协议看起来像:

@protocol MenuInteractable <NSObject>
@property (nonatomic) CGFloat scale;
@end

...

我注意到CCNode的setScale方法签名使用的是float类型,而不是CGFloat。

显然,这两种类型不匹配会导致iPad专业版的架构以这种方式将价值归零 - 奇怪的是这种行为只发生在iPad专业版,而不是iPad视网膜,iPhone 5/6 ,iPhone 6 +。

将协议更改为:

@protocol MenuInteractable <NSObject>
@property (nonatomic) float scale;
@end

修复了问题。