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

setScale: method not working on iPad pro?

我有一个 cocos2d 应用程序可以在视网膜 iPads 和 iPhones 上完美运行,我刚出去购买了一个 iPad pro 以确保运行正常,果然,大量的东西显示不正确。

经过一些调试后,我确定这是因为许多元素的比例为 0...所以我进行了更多调试,例如我的代码中有一行:

self.scale = 1.0f;

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

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

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

(lldb) expr s
(float) [=13=] = 0

什么?!?!?!?!?!??!?!? 1.0 到底是如何传入这个函数并变成 0 的???为什么 iPad pro 违反计算机科学的所有定律?

如果我在视网膜 iPad 或 iPhone 5 或 iPhone 6 或 iPhone 6 plus 上做同样的事情,则比例为 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 pro 的架构以这种将值归零的方式运行——奇怪的是这种行为只发生在 iPad pro 上,而不是 iPad 视网膜,iPhone 5/6,iPhone 6+。

将协议更改为:

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

解决了问题。