вторник, 7 августа 2012 г.

Подготавливаем приложение для 10.8

Все что нужно сделать разработчикам, это правильно настроить работу с режимом HiDPI.

Если приложение активно использует OpenGL.

При инициализации вью к которому привязан 3D-context, делаем проверку ретины.

  1. #if (defined(MAC_OS_X_VERSION_10_7)) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7  
  2.         if ( [ NSApplication usingLionOSX ] )  
  3.         {  
  4.           NSRect baseBounds = [ self bounds ];  
  5.           NSRect hdpiBounds = [ self convertRectToBacking : baseBounds ];  
  6.            
  7.           if (NO == NSEqualSizes(baseBounds.size, hdpiBounds.size))  
  8.           {            
  9.               [ self setWantsBestResolutionOpenGLSurface : YES ];  
  10.           }  
  11.         }  
  12. #endif  

При изменении размеров приложения пересчитываем размеры.

  1. - (void) updateBounds  
  2. {  
  3.     NSRect  baseBounds  =   [ self bounds ];  
  4.       
  5. #if (defined(MAC_OS_X_VERSION_10_7)) && MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_7  
  6.     if ( [ NSApplication usingLionOSX ] )  
  7.     {        
  8.         baseBounds      =   [ self convertRectToBacking : baseBounds ];  
  9.     }   
  10. #endif  
  11.   ....  
  12.    
  13.   glClearColor ( 0.0f, 0.0f, 0.0f, 1.0f );   
  14.   glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );   
  15.   glViewport (0.0f, 0.0f, baseBounds.size.width, baseBounds.size.height );  
  16.   ....  
  17.   
  18. }  

Про класс NSImage.

Вся работа идет не в пикселях, а в точках. Выхода два использовать QuartzCore для работы со всеми изоюбражениями или сделать небольшой фикс-ресайз результирующего изображения.

  1. NSImageRep* rep = [[img representations] objectAtIndex:0];    // fix HDPI  
  2. if (rep)  
  3. {  
  4.        NSSize size = NSMakeSize ([rep pixelsWide], [rep pixelsHigh]);  
  5.        [img setSize : size];  
  6. }  

Ресурсы и бонусы.

Все UI элементы представленные в виде растровых изображений, должны быть корректно увеличины в два раза. XCode автоматически их подхватит, достаточно добавить *texture.name*@2x.tiff  экземпляр вашей текстуры в проект. Если нужно вручную создавать растры из ресурсов то есть метод [NSimage imageNamed : @"*texture.name*"] корректно загрузит нужную картинку.

Разумеется не надо забывать про иконку, это полностью работа дизайнера отрисовка иконки в размере 1024x1024px.

Update 08.11.2012

В XCode 4.x появилась интересная фича по объединению изображений в разных разрешениях в один файл. Настройка называется Combine High Resolution Artwork. Ресурсы в (*.app) будут соединены в один файл (texture.png и texture@2x.png - будут соединены в файл texture.tiff). Это все работает начиная с 10.7.+. Если вам требуется что бы программа работала и на 10.6, то следует отключить эту настройку. 

Важное замечание по поводу ретины и поддержки под старые ОС. В XCode 4.4+ был выкинут за ненадобностью SDK под 10.6 osx. Сборка проекта с привлечением этого SDK (можно выпилить из более старых версий XCode), под 10.7.+ и 10.8.+ не даст проявится всем глюкам. Поэтому для проверки работоспособности стоит собирать проект именно в 10.6. и там же его тестить.

Комментариев нет: