iphone objective-c ios xcode ios6

iphone - iOS 6 MFMailComposeViewController: solo admite RGBA o el espacio de color blanco, este método es un hack



objective-c xcode (10)

realmente, realmente extraño error

Tengo una aplicación que funcionaba bien en iOS5 / .1, ahora estoy teniendo algunos problemas de transición con iOS6 pero esta es confusa.

Tengo un código que inicia un compositor de correo, y desde iOS 6 causa un bloqueo con este error:

* Error de aserción en - [UICGColor encodeWithCoder:], /SourceCache/UIKit/UIKit-2372/UIColor.m:1191 2012-09-26 02: 14: 38.044 MyCQs Medical [2126: 1b03] * Aplicación de finalización debido a excepción no detectada '' NSInternalInconsistencyException '', razón:'' Solo admite RGBA o el espacio de color blanco, este método es un truco ''.

¿Alguna sugerencia? A través del método de prueba y error al comentar varias líneas, parece ser la línea alloc / init que causa el error, aunque cuando todas las líneas están sin comentario, se ejecutan todos los NSLogs, incluido "presente", que indica que todo lo que debería llamarse, ha sido. la aplicación se bloquea antes de que se presente en pantalla el complemento de correo, realmente agradecería cualquier consejo aquí

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:@"[email protected]", 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"); } }


Ok, solo una solución parcial, pero es la mejor en la que puedo pensar sin algunos cambios de código bastante perturbadores.

Para cualquier otra persona que tenga este problema en el futuro, creo que es un error en iOS 6, MFMailComposeViewController se bloquea cuando ha configurado UITableView separaratorStyle en colorWithPatternImage, pero funciona bien cuando utiliza un color sólido, por lo que:

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"]]]; }


Descubrí que MFMailComposeViewController solo se bloquea cuando se usa [[UITableView appearance] declaración [[UITableView appearance] . No tuve ningún problema cuando configuré background y separatorColor en viewDidLoad de la tabla. El único problema es que debes hacer esto para cada tabla.

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


En realidad, creo que esto es un error importante, ¿alguien ya archivó un radar?

Tal como me parece, la afirmación arroja siempre que uses "colorWithPatternImage" en DONDEQUIERA en los proxies de apariencia de tu controlador de vista presentador.

Creo que lo que sucede es que iOS intenta almacenar la apariencia de su aplicación antes de cambiar a un servicio por separado (que es lo que hace MFMailComposeViewController, ahora es un "controlador de vista remota" que es presentado por su aplicación pero que es administrado por otra aplicación / proceso), ya que la aplicación de correo quiere determinar la apariencia en sí misma para que cambie cosas como colores de tinte, etc. Más sobre el controlador de vista remota aquí, en caso de que alguien esté interesado: http://oleb.net/blog/2012/10/remote -view-controllers-in-ios-6 /

Esto parece fallar Esto tiene que ser un error, la imagen debe ser codificable.

Las soluciones pueden ser difíciles. Traté de cambiar el color estampado por uno simple justo antes de presentar el controlador de vista pero encontré que al menos tienes que asegurarte de que realmente se vuelva a dibujar en la pantalla y se da por vencido (realmente no necesito el patrón).


Este hilo me dio excelentes pistas sobre cómo solucionar un problema similar en mi aplicación utilizando ShareKit y el intento de enviar por correo electrónico una imagen de una vista. Ahora solo cambio la apariencia de UISwitch para versiones de menos de 6.0.

Se llama a este código cuando se inicia mi aplicación:

// 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]; }


Estoy enfrentando el mismo problema usando ''colorWithPatterImage'' para un UIBarButtonItem dentro de la navBar de mi tableViewController usado para mostrar una vista modal (no estoy usando MFMailComposeViewController ).

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

Necesitaba reemplazarlo con un color RGBa;


@coolio tiene razón, parece suceder cuando se usa un color modelado con cualquier clase de controlador. (Al menos UITabBarController y UITableViewController, aparentemente).

Lo solucioné subclasificando el controlador de mi barra de pestañas y usando la apariencia cuando estaba contenida: De esta forma, aún puede usar su textura elegante sin necesidad de subclasificar MFMailComposeViewController ni olfatear versiones de iOS, etc.

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


Es un error de iOS 6 lo informo y fue marcado como duplicado. Entonces, alguien informa ese error antes.


Mi problema también se debió al uso de colorWithPatternImage, pero me pareció que solo causaba un problema cuando se usaba en elementos que se muestran en el MFMailCompserViewController, por ejemplo:

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


Para usar el patrón, puede usar resizableImageWithCapInsets. En Monotouch, parece que esto:

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); }


Mis aplicaciones se bloquearon en iOS 7 cuando colorWithPatternImage e intento presentar un MFMailComposeViewController . Tengo que determinar el color de un UIImage porque el UIImage puede ser elegido por el usuario, y quiero "tema" mi aplicación en función de la imagen seleccionada por el usuario.

La solución para mí (aunque sea un poco hacky) es tomar los valores RGBA del origen (0,0) del UIImage, luego aplicar eso como color de fondo en lugar de usar 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; }

Ahora, si utilizo este UIColor como fondo en lugar de colorWithPatternImage , puedo compartir el contenido de mi corazón sin encontrar esta rara excepción.

El método anterior fue adaptado de una solución que encontré aquí: https://.com/a/1262893/1103584