ABPersonSetImageData Только изменение эскиза контакта, а не полное изображение - PullRequest
6 голосов
/ 06 октября 2009

Я пытаюсь добавить рамку вокруг каждой фотографии контакта. У меня есть рабочий код для создания этого граничного изображения и рабочий код для его установки в качестве изображения контакта:

if (image) {
    NSData *dataRef = UIImagePNGRepresentation(image); 
    CFDataRef cfdata = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
    CFErrorRef error;
    ret = ABPersonSetImageData(person, cfdata, &error);
    if (ret) {
        ret = ABAddressBookSave(addressBook, &error);
    } else {
        DebugLog(@"Could not write the image to the person: %@", [error description]);
    }
    CFRelease(cfdata);
}

Проблема, с которой я сталкиваюсь, заключается в том, что хотя при просмотре в приложении «Контакты» или «Телефон» изображение с рамкой правильно отображается на миниатюре, полноэкранное изображение, отображаемое при входящем вызове, не отображается.

Изначально я думал, что это немного увеличено, поэтому я экспериментировал с размером границы. Я подтвердил, что на большом снимке граница вообще не отображается. Я что-то упускаю из виду?


РЕДАКТИРОВАТЬ 10/9/09 Я общался с Apple, и это действительно ошибка в структуре адресной книги. Если вы читаете этот пост, я предлагаю вам сообщить об ошибке в Apple at, чтобы ускорить исправление.

1 Ответ

7 голосов
/ 07 октября 2009

Я собираюсь ответить на свой вопрос здесь, так как думаю, что я понял, в чем проблема. Если у вашего контакта еще нет изображения, при использовании ABPersonSetImageData будут добавлены как миниатюра, так и полноразмерный снимок. Если у вашего контакта уже есть полноразмерное изображение, ТОЛЬКО миниатюра будет установлена ​​при использовании ABPersonSetImageData.

После осознания этого решения нет ничего проще. Я просто удаляю картинку прямо перед ее установкой.

if (image) {
    NSData *dataRef = UIImagePNGRepresentation(image); 
    CFDataRef cfdata = CFDataCreate(NULL, [dataRef bytes], [dataRef length]);
    CFErrorRef error;

    ABPersonRemoveImageData(person, &error); // <-- clean any image first from ref
    ABAddressBookSave(addressBook, &error);

    ret = ABPersonSetImageData(person, cfdata, &error);
    if (ret) {
        ret = ABAddressBookSave(addressBook, &error);
    } else {
        DebugLog(@"Could not write the image to the person");
    }
    CFRelease(cfdata);
}

ПРИМЕЧАНИЕ *. Это создает квадратную версию полноразмерного изображения. Процесс обрезает верх и низ изображения и устанавливает его на 320x320. Но это работает.

РЕДАКТИРОВАТЬ 10/9/09 Я общался с Apple, и это действительно ошибка в структуре адресной книги. Если вы читаете этот пост, я предлагаю вам сообщить об ошибке в Apple at, чтобы ускорить исправление.

...