#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
исправлена проблема.