широкий цвет на iPhone7

#ios #cgcontextref

#iOS #cgcontextref

Вопрос:

Вопрос в том :

При работе на iPhone7,

Я получаю CGContextRef от UIView , тогда BitsPerPixel равен 64. Потому что мой .a может работать только с традиционным буфером растрового изображения цветового пространства RGB, битспиксель которого равен 32,

Может ли кто-нибудь знать, как преобразовать, CGContextRef цветовое пространство которого имеет широкий цвет, в tranditional CGContextRef такое же, как на iPhone6?

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

1. Это всего лишь идея. Итак, широкий цвет — это особенность (UIDisplayGamut). Поэтому, возможно, вы могли бы использовать пользовательский контроллер представления контейнера, чтобы вы могли вызвать setOverrideTraitCollection(_:forChildViewController:) и обмануть свой дочерний контроллер представления, заставив его поверить, что он работает на устройстве без wide color.

2. @matt Большое спасибо за ответ, я попробую. Вчера я нашел способ справиться с широким цветом, установив для свойства слоя UIView «contentsFormat» значение kCAContentsFormatRGBA8Uint, тогда значение CGContextRef, полученное во время выполнения, равно 32 битам в пикселях

3. Если это сработает, вы должны опубликовать это в качестве ответа! Этот материал с широким использованием цветов, безусловно, вызовет некоторую путаницу, поэтому ваша работа здесь может быть очень полезна другим. (Также, пожалуйста, обратите внимание, что я не знаю, сработает ли моя идея! Мне нужно, чтобы ты попробовал это для меня.)

4. @matt Я попробовал вашу идею, но, похоже, она провалилась. Но способ, который я нашел, просто отлично работает.

5. Это здорово. Пожалуйста, опубликуйте это в качестве ответа!

Ответ №1:

Решение приведено ниже:

 #if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_9_3
-(void) layerWillDraw:(CALayer *)layer 
{
    if( [[[UIDevice currentDevice] systemVersion] floatValue] >= 10.0 )
    {
        NSString* format = layer.contentsFormat;
        if( ![format isEqualToString:kCAContentsFormatRGBA8Uint]  )
            layer.contentsFormat = kCAContentsFormatRGBA8Uint;
    }
}
#endif
  

добавьте приведенный выше код в представление, на котором вы будете рисовать, тогда CGContextRef, полученный из представления, будет традиционным, как и на iPhone6