2009-10-06 53 views
6

我試圖在每張聯繫人照片周圍添加邊框。我已經工作的代碼來創建此接壤形象和工作代碼,將其設置爲接觸式圖像:ABPersonSetImageData只改變聯繫人縮略圖而不是完整的圖片

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 我一直在與蘋果溝通,這確實是地址簿框架中的一個錯誤。如果你正在閱讀這篇文章,那麼我建議你 file a bug with Apple在幫助加快修復。

回答

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 我一直在與蘋果溝通,這確實是地址簿框架中的一個錯誤。如果你正在閱讀這篇文章,那麼我建議你file a bug with Apple在幫助加快修復。

+0

我跟着這個,我可以替換圖像,但它仍然顯示縮略圖圖片,當一個電話來... 我試圖手動刪除圖片,並將其替換的代碼。但沒用。 我不知道這是否有效? 謝謝 – 2010-07-23 12:44:17