Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB
在使用xcode5 sdk iOS7環(huán)境,創(chuàng)建圖形上下文進(jìn)行圖形繪制,合并,裁剪,特效處理等時(shí)避免不了使用如下方法創(chuàng)建位圖:
在?iOS7以前,是使用如下方法創(chuàng)建的:
?
CG_EXTERN?CGContextRef?CGBitmapContextCreate(void?*data,?size_t?width,
??size_t?height,?size_t?bitsPerComponent,?size_t?bytesPerRow,
??CGColorSpaceRef?space,CGImageAlphaInfo?bitmapInfo)
?
注意最后一個(gè)參數(shù)類型是?CGImageAlphaInfo?枚舉類型中的kCGImageAlphaPremultipliedLast值。其整型值為1。
typedef?CF_ENUM(uint32_t, CGImageAlphaInfo)?
{
? kCGImageAlphaNone, ? ? ? ? ? ? ??/* For example, RGB. */
? kCGImageAlphaPremultipliedLast,??/* For example, premultiplied RGBA */
? kCGImageAlphaPremultipliedFirst,?/* For example, premultiplied ARGB */
? kCGImageAlphaLast, ? ? ? ? ? ? ??/* For example, non-premultiplied RGBA */
? kCGImageAlphaFirst,? ? ? ? ? ? ??/* For example, non-premultiplied ARGB */
? kCGImageAlphaNoneSkipLast, ? ? ??/* For example, RBGX. */
? kCGImageAlphaNoneSkipFirst,? ? ??/* For example, XRGB. */
? kCGImageAlphaOnly? ? ? ? ? ? ? ??/* No color data, alpha data only */
};
?
?
但是在iOS7版本中,這個(gè)最后的參會類型發(fā)生了變化。看一下定義:
?
CGContextRef?CGBitmapContextCreate(void?*data,?size_t?width,
??size_t?height,?size_t?bitsPerComponent,?size_t?bytesPerRow,
??CGColorSpaceRef?space,?CGBitmapInfo?bitmapInfo)
很明顯最后一個(gè)參數(shù)由CGImageAlphaInfo?變化為?CGBitmapInfo,看一下這個(gè)類型的定義
?
typedef?CF_OPTIONS(uint32_t, CGBitmapInfo)
?{
? kCGBitmapAlphaInfoMask = 0x1F,
? kCGBitmapFloatComponents = (1 << 8),
? kCGBitmapByteOrderMask = 0x7000,
? kCGBitmapByteOrderDefault = (0 << 12),
? kCGBitmapByteOrder16Little = (1 << 12),
? kCGBitmapByteOrder32Little = (2 << 12),
? kCGBitmapByteOrder16Big = (3 << 12),
? kCGBitmapByteOrder32Big = (4 << 12)
?
}?CF_ENUM_AVAILABLE(10_4, 2_0);
從頭到尾沒有發(fā)現(xiàn)值為1的枚舉量值。故在使用的時(shí)候會出現(xiàn)如下警告:
?
Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGBitmapInfo' (aka 'enum CGBitmapInfo')
?
意思很明顯不過,類型不匹配非法。
以下給出解決方法:
第一種方法,定義宏:
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
? ? ?#define kCGImageAlphaPremultipliedLast ?(kCGBitmapByteOrderDefault?|?kCGImageAlphaPremultipliedLast)
#else?
? ? ?#define kCGImageAlphaPremultipliedLast ?kCGImageAlphaPremultipliedLast
#endif
?
這樣就會直接映射出一個(gè)值為1的宏,原有方法不用改變。
?
第二種方法:原理和第一個(gè)一樣,目的 還是為了生產(chǎn)出一個(gè)為1的值,直接修改代碼。
#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
? ? int?bitmapInfo =?kCGBitmapByteOrderDefault?|?kCGImageAlphaPremultipliedLast;
#else
? ???int?bitmapInfo =?kCGImageAlphaPremultipliedLast;
#endif
?
? ??CGContextRef?context =?CGBitmapContextCreate(nil, CGContexWith*2, 290.0*2, 8, 4*CGContexWith*2, colorSpace, bitmapInfo);
?
其實(shí)所有的做法,不外乎為了使這里的值為1,類型匹配。你也直接可以傳1,不用麻煩的各種寫代碼。也可以直接進(jìn)行類型強(qiáng)制轉(zhuǎn)換,這個(gè)你隨便。只是每個(gè)人的習(xí)慣不一樣,故,如何解決,自己參考決定 。
轉(zhuǎn)自http://hi.baidu.com/yunhuaikong/item/0fe2ccca5f041c7289ad9eac
可能以上的好多宏定義看不懂,但是不要緊,根據(jù)我的測試,只需要把報(bào)錯(cuò)的那一句
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef ctx = CGBitmapContextCreate(0, size, size, 8, size * 4, colorSpace, kCGImageAlphaPremultipliedLast)最后面這個(gè)參數(shù)改成kCGBitmapByteOrderDefault?|?kCGImageAlphaPremultipliedLast即可
總結(jié)
以上是生活随笔為你收集整理的Implicit conversion from enumeration type 'enum CGImageAlphaInfo' to different enumeration type 'CGB的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: warning: directory n
- 下一篇: ios 动态监听键盘输入法和高度