2009-10-06 5 views
6

Ich versuche, um jedes Kontaktfoto einen Rahmen hinzuzufügen. Ich habe Code arbeiten, um dieses grenzte Bild zu schaffen und Arbeitscode es als Kontakt Bild zu setzen:ABPersonSetImageData Nur Ändern des Kontakt-Thumbnails und nicht des vollständigen Pic

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

Das Problem, das ich gesehen habe ist, dass während der umrandete Bild korrekt im Miniaturbild angezeigt, wenn in den Kontakten angezeigt oder Telefon-App, das Vollbild, das bei einem eingehenden Anruf angezeigt wird, nicht.

Ich dachte ursprünglich, es wurde nur ein wenig gezoomt, also experimentierte ich mit der Randgröße. Ich habe bestätigt, dass die Grenze auf dem großen Schuss überhaupt nicht zeigt. Fehle ich etwas Offensichtliches?


EDIT 10/9/09 Ich habe in der Kommunikation mit Apple und dies ist in der Tat ein Fehler im Adressbuch-Framework. Wenn Sie diesen Beitrag lesen, dann schlage ich Ihnen file a bug with Apple vor, um die Reparatur zu beschleunigen.

Antwort

7

Ich werde meine eigene Frage hier beantworten, da ich denke, ich habe herausgefunden, was das Problem ist. Wenn Ihr Kontakt noch kein Bild hat, werden sowohl das Thumbnail als auch die Vollansicht hinzugefügt, wenn Sie ABPersonSetImageData verwenden. Wenn Ihr Kontakt bereits ein Bild in voller Größe enthält, wird bei Verwendung von ABPersonSetImageData nur die Miniaturansicht festgelegt.

Nach dieser Erkenntnis ist die Lösung ein Kinderspiel. Ich entferne das Bild einfach, bevor ich es setze.

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

HINWEIS * Dies erstellt eine quadratische Version des Bilds in voller Größe. Der Prozess schneidet den oberen und unteren Rand des Bildes ab und legt ihn auf 320 x 320 fest. Aber es funktioniert.

EDIT 10/9/09 Ich habe in der Kommunikation mit Apple und dies ist in der Tat ein Fehler im Adressbuch-Framework. Wenn Sie diesen Beitrag lesen, dann schlage ich Ihnen file a bug with Apple vor, um die Reparatur zu beschleunigen.

+0

Ich folgte diesem und ich könnte das Bild ersetzen, aber es zeigt immer noch das Miniaturbild, wenn ein Anruf kommt ... Ich habe versucht, das Bild manuell löschen und ersetzen Sie es durch den Code. Aber keine Verwendung. Ich frage mich, ob das funktioniert? danke –