iOS 6 MFMailComposeViewController:只支持RGBA或白色空间,这种方法是一种破解

真的,真的很奇怪的错误

我有一个在iOS5 / .1中正常工作的应用程序,现在我遇到了iOS6的一些转换问题,但是这个问题很混乱。

我有一些启动邮件编辑器的代码,自iOS 6以来,它导致崩溃,这个错误:

*断言失败 – [UICGColor encodeWithCoder:],/SourceCache/UIKit/UIKit-2372/UIColor.m:1191 2012-09-26 02:14:38.044 MyCQs Medical [2126:1b03] *终止应用程序由于未捕获的exception' NSInternalInconsistencyException',原因是:'只支持RGBA或白色空间,这种方法是黑客攻击。

有什么build议么? 通过尝试和错误注释各行,似乎是导致错误的alloc / init行,虽然所有的行都没有注释,所有的NSLogs被执行,包括“present”,它表示应该被调用的所有东西,已经。 该应用程序崩溃之前邮件聚合器是在屏幕上,我真的很感激在这里的任何build议

if (indexPath.row == 3) { if([MFMailComposeViewController canSendMail]){ mailComposer = [[MFMailComposeViewController alloc]init]; NSLog(@"Alloc, init"); mailComposer.mailComposeDelegate = self; NSLog(@"Set delegate"); NSArray *toArray = [[NSArray alloc]initWithObjects:@"john@doe.com", nil]; NSLog(@"To array"); [mailComposer setToRecipients:toArray]; NSLog(@"To recipients"); [mailComposer setSubject:@"Message from a MyCQs user!"]; NSLog(@"Subject"); NSLog(@"About to present mail composer"); [[mailComposer navigationBar] setTintColor:[UIColor blackColor]]; [self presentModalViewController:mailComposer animated:YES]; NSLog(@"Present"); } } 

确定只是一个部分的解决scheme,但这是我能想到的最好的一个,没有一些相当破坏性的代码更改。

对于将来会遇到这个问题的任何人,我认为这是iOS 6中的一个错误,当您将UITableView的separatorStyle设置为colorWithPatternImage时,MFMailComposeViewController会崩溃,但是当您使用纯色时,它会正常工作,因此:

  if ([[[UIDevice currentDevice] systemVersion] floatValue] > 5.2) { NSLog(@"Using iOS 5x"); [[UITableView appearance]setSeparatorColor:[UIColor colorWithRed:142.0/255.0 green:130.0/255.0 blue:76.0/255.0 alpha:1.0]]; } else { NSLog(@"Using iOS 6x, Table view use pattern color"); [[UITableView appearance]setSeparatorColor:[UIColor colorWithPatternImage: [UIImage imageNamed:@"dotted-line2.png"]]]; } 

其实我相信这是一个重大的bug,有没有人提出过雷达呢?

在我看来,只要您在呈现视图控制器的外观代理中使用“colorWithPatternImage”任何地方,断言就会抛出。

我觉得会发生什么呢,iOS会尝试存储你的应用程序的外观,然后切换到一个单独的服务(这是MFMailComposeViewController所做的,它现在是一个“远程视图控制器”,由您的应用程序呈现,但由另一个应用程序/过程),因为邮件应用程序想要确定外观本身,所以它改变像色调等东西更多关于远程视图控制器在这里,以防有人感兴趣: http : //oleb.net/blog/2012/10/remote -view控制器function于IOS-6 /

这似乎失败了。 这必须是一个错误,图像应该是可编码的。

解决方法可能很难。 我试图在呈现视图控制器之前交换一个简单的图案颜色,但发现你至less必须确保它真的在屏幕上重绘,并放弃(我真的不需要模式)。

我的问题也是由于使用colorWithPatternImage,但我发现它似乎只会导致一个问题,当在MFMailCompserViewController上显示的元素使用,例如:

 [[UINavigationBar appearance] setTintColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"navbar"]]]; 

我发现MFMailComposeViewController只在[[UITableView appearance]语句中使用了colorWithPatternImage时才会崩溃。 当我在表的viewDidLoad中设置background和colorColor时,我没有任何问题。 唯一的问题是你需要为每个表做这个。

 [self.tableView setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"image.png"]]]; [self.tableView setSeparatorColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"image.png"]]]; 

@coolio是对的,它似乎发生在任何控制器类使用图案的颜色。 ( 至less UITabBarController和UITableViewController,显然。)

我通过inheritance我的标签栏控制器,并使用appearanceWhenContainedIn:来解决这个问题。 这样,你仍然可以使用你的花式纹理,而不需要子类MFMailComposeViewController或嗅探iOS版本等。

 UIColor *tabBarBgPattern = [UIColor colorWithPatternImage:...]; [[UITabBar appearanceWhenContainedIn:[MyTabBarController class], nil] setBackgroundColor:tabBarBgPattern]; 

这个线程给了我很多关于如何在我的应用程序中使用ShareKit修复类似问题的线索,并试图通过电子邮件发送一个视图的图像。 现在我只更改小于6.0版本的UISwitch外观。

这段代码在我的应用程序启动时被调用:

 // Protect against IOS 6.0 BUG: 'NSInternalInconsistencyException', reason: 'Only support RGBA or the White color space, this method is a hack.' if ([[[UIDevice currentDevice] systemVersion] floatValue] < 6.0) { UIImage *patternImage = [UIImage imageNamed:@"solid-colors_blue.png"]; UIColor* switchColor = [UIColor colorWithPatternImage:patternImage]; [[UISwitch appearance] setOnTintColor: switchColor]; } 

我面临同样的问题,使用“colorWithPatterImage”UBarButtonItem在我的tableViewController的navBar内用于显示模式视图(我不使用MFMailComposeViewController )。

 [[UIBarButtonItem appearance] setTintColor:[UIColor colorWithPatternImage:bgImage]]; 

我需要用RGBa颜色replace它;

使用colorWithPatternImage并尝试呈现MFMailComposeViewController时,我的应用程序在iOS 7上崩溃。 我必须确定从UIImage的颜色,因为UIImage可以由用户select,我想“主题”我的应用程序基于用户select的图像。

我的解决scheme(尽pipe是一种哈克)是抓住UIImage的原点(0,0)的RGBA值,然后将其作为背景颜色,而不是使用colorWithPatternImage

 + (UIColor*)getUIColorFromImageAtOrigin:(UIImage*)image { // First get the image into your data buffer CGImageRef imageRef = [image CGImage]; NSUInteger width = CGImageGetWidth(imageRef); NSUInteger height = CGImageGetHeight(imageRef); CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); unsigned char *rawData = (unsigned char*) calloc(height * width * 4, sizeof(unsigned char)); NSUInteger bytesPerPixel = 4; NSUInteger bytesPerRow = bytesPerPixel * width; NSUInteger bitsPerComponent = 8; CGContextRef context = CGBitmapContextCreate(rawData, width, height, bitsPerComponent, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); CGColorSpaceRelease(colorSpace); CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef); CGContextRelease(context); // Now your rawData contains the image data in the RGBA8888 pixel format. int byteIndex = (bytesPerRow * 0) + 0 * bytesPerPixel; CGFloat red = (rawData[byteIndex] * 1.0) / 255.0; CGFloat green = (rawData[byteIndex + 1] * 1.0) / 255.0; CGFloat blue = (rawData[byteIndex + 2] * 1.0) / 255.0; CGFloat alpha = (rawData[byteIndex + 3] * 1.0) / 255.0; UIColor *acolor = [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; free(rawData); return acolor; } 

现在,如果我使用这个UIColor作为背景而不是colorWithPatternImage ,我可以分享我心中的内容,而不会遇到这个奇怪的exception。

上面的方法是从我在这里find的解决scheme改编的: https : //stackoverflow.com/a/1262893/1103584

这是一个iOS 6的错误报告,它被标记为dublicate。 所以,有人早些时候报告这个错误。

对于使用模式,您可以使用resizableImageWithCapInsets。 在Monotouch中看起来像这样:

 var sba = UISearchBar.Appearance; var img = UIImage.FromBundle("myResource.png"); if (UIDevice.CurrentDevice.CheckSystemVersion(6, 0)) { img = img.CreateResizableImage(UIEdgeInsets.Zero, UIImageResizingMode.Tile); sba.BackgroundColor = UIColor.LightGray; sba.BackgroundImage = img; } else { sba.BackgroundImage = new UIImage(); sba.BackgroundColor = UIColor.FromPatternImage(img); }