6

我正在尝试在每张联系人照片周围添加边框。我有工作代码来创建这个带边框的图像和工作代码来将其设置为联系人图像:

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 提交一个错误,以帮助加快修复速度。

4

1 回答 1

7

我将在这里回答我自己的问题,因为我想我弄清楚了问题所在。如果您的联系人还没有图像,则在您使用 时会同时添加缩略图和全尺寸照片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 提交一个错误,以帮助加快修复速度。

于 2009-10-06T21:28:52.760 回答