setScale: метод не работает на iPad pro?

#ios #cocos2d-iphone

#iOS #cocos2d-iphone

Вопрос:

У меня есть приложение cocos2d, которое отлично работает на iPad и iPhone с сетчаткой, и я просто пошел и купил iPad pro, чтобы убедиться, что он работает нормально, и, конечно же, большое количество вещей отображается неправильно.

После некоторой отладки я определил, что это потому, что многие элементы имеют масштаб 0… Итак, я провел еще немного отладки, и, например, в моем коде есть одна строка, которая:

 self.scale = 1.0f;
 

Если я поставлю точку останова в этой строке, а затем перейду в функцию setter, которую мой класс наследует от CCNode:

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

И .. затем в отладчике я смотрю, на что устанавливаются значения _scaleX и _scaleY ivar:

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

Что?!?!?!?!!?!??!!?!? Как в мире 1.0 передается в эту функцию и превращается в 0??? Почему iPad pro игнорирует все законы информатики?

Если я сделаю то же самое на iPad retina или iPhone 5 или iPhone 6 или iPhone 6 plus, масштаб будет равен 1,0, А НЕ 0.

Ответ №1:

Вау… Итак, оказывается, причиной этого было то, что этот объект использовался с протоколом:

 // 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
 

Я заметил, что в сигнатуре метода setScale CCNode используется тип float, а не CGFloat .

Таким образом, очевидно, что несоответствие этих двух типов приводит к тому, что архитектура iPad pro ведет себя таким образом, обнуляя значение — странно, что такое поведение происходит только на iPad pro, а не на iPad retina, iPhone 5/6, iPhone 6 .

изменение протокола на:

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

исправлена проблема.