Подтвердить что ты не робот

IOS 6 MFMailComposeViewController: поддерживает только RGBA или белое цветовое пространство, этот метод является взломом

действительно, действительно странная ошибка

У меня есть приложение, которое отлично работает в iOS5/.1, теперь у меня есть несколько проблем с переходом с iOS6, но это запутывает.

У меня есть код, который запускает почтовый композитор, и с iOS 6 он вызывает сбой с этой ошибкой:

* Ошибка утверждения в - [UICGColor encodeWithCoder:],/SourceCache/UIKit/UIKit-2372/UIColor.m:1191 Причина: исключение "NSInternalInconsistencyException", причина: "Поддерживать только RGBA или белое цветовое пространство, этот метод является взломом.

Любые предложения? Через пробную версию и ошибку, комментируя различные строки, кажется, что строка alloc/init вызывает ошибку, хотя, когда все строки раскоментированы, выполняются все NSLogs, включая "present", который указывает, что все, что должно быть вызвано, был. приложение сработает, прежде чем почтовый компостер будет представлен на экране, я бы очень признателен за любой совет здесь.

            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");
             }
    }
4b9b3361

Ответ 1

Хорошо только частичное решение, но это лучшее, о котором я могу думать без каких-либо довольно разрушительных изменений кода.

Для всех, кто получит эту проблему в будущем, я думаю, что это ошибка в iOS 6, MFMailComposeViewController вылетает, когда вы устанавливаете UITableView separatorStyle в colorWithPatternImage, но он отлично работает при использовании сплошного цвета, поэтому:

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

Ответ 2

На самом деле, я считаю, что это значительная ошибка, кто-нибудь подал радар?

Как мне кажется, утверждение генерируется всякий раз, когда вы используете "colorWithPatternImage" ANYWHERE в ваших прокси-серверах представления представления представления.

Я думаю, что происходит, что iOS пытается сохранить внешний вид вашего приложения, прежде чем переключиться на отдельную услугу (что делает MFMailComposeViewController, теперь это "контроллер удаленного просмотра", который представлен вашим приложением, но который управляется другое приложение/процесс), поскольку приложение Mail хочет определить внешний вид, поэтому он меняет такие вещи, как оттенки цвета и т.д. Подробнее о контроллере удаленного просмотра здесь, если кому-то интересно: http://oleb.net/blog/2012/10/remote-view-controllers-in-ios-6/

Кажется, что это терпит неудачу. Это должно быть ошибкой, изображение должно быть кодируемым.

Обходные пути могут быть трудными. Я попытался обменять узорный цвет на простой, прямо перед представлением контроллера вида, но обнаружил, что вам по крайней мере нужно убедиться, что он действительно перерисовывается на экране и сдался (мне действительно не нужен шаблон).

Ответ 3

Моя проблема также связана с использованием colorWithPatternImage, но я обнаружил, что это, по-видимому, вызывает проблему только при использовании элементов, отображаемых в MFMailCompserViewController, например:

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

Ответ 4

Я обнаружил, что MFMailComposeViewController только сбой, когда colorWithPatternImage используется в [[UITableView appearance]. У меня не было проблем, когда я устанавливал фон и separatorColor в таблице viewDidLoad. Единственная проблема - вам нужно сделать это для каждой таблицы.

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

Ответ 5

@coolio прав, кажется, что это происходит при использовании цветного рисунка с любым классом контроллера. (По крайней мере, UITabBarController и UITableViewController).

Я обошел это, подклассифицировав мой контроллер панели вкладок и используя внешний видWhenContainedIn:. Таким образом, вы все равно можете использовать свою причудливую текстуру без необходимости подкласса MFMailComposeViewController или версии для iOS-нюха и т.д.

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

Ответ 6

Этот поток дал мне отличные подсказки о том, как исправить аналогичную проблему в моем приложении с помощью ShareKit и попытаться отправить изображение в виде изображения. Теперь я изменяю внешний вид UISwitch для версий менее 6.0.

Этот код вызывается при запуске приложения:

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

Ответ 7

Я столкнулся с той же проблемой, используя 'colorWithPatterImage' для UIBarButtonItem внутри navBar моего tableViewController, используемого для отображения модального представления (я не использую MFMailComposeViewController).

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

Мне нужно было заменить его цветом RGBa;

Ответ 8

Мои приложения рушились на iOS 7 при использовании colorWithPatternImage и пытались представить MFMailComposeViewController. Я должен определить цвет из UIImage, потому что UIImage может быть выбран пользователем, и я хочу "тему" ​​моего приложения на основе выбранного пользователем изображения.

Решение для меня (хотя и хакерского) заключается в том, чтобы захватить значения RGBA начала (0,0) UIImage, а затем применить это как фоновый цвет вместо использования 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, я могу поделиться своим сердечным содержимым, не встречая этого странного исключения.

Вышеуказанный метод был адаптирован из решения, которое я нашел здесь: fooobar.com/questions/35050/...

Ответ 9

Это ошибка iOS 6, я сообщаю об этом, и она была помечена как dublicate. Итак, кто-то сообщил об этом раньше.

Ответ 10

Для использования шаблона вы можете использовать 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);
}