我使用CNMutableContact
创建/更新联系人。
我可以通过imageData
属性设置新图片,但我需要设置自定义裁剪信息以创建缩略图。属性thumbnailImageData
是只读的。
代码:
let cnContact = CNMutableContact()
cnContact.imageData = imageData //created before
如何添加自定义thumbnailImage裁剪?
答案 0 :(得分:2)
似乎在iOS中无法设置缩略图。但是,根据定义,图像的缩略图是裁剪为较小尺寸的相同图像。因此,iOS将在保存联系人的同时从联系人上设置的图像数据自动生成缩略图。
如果您想为缩略图和实际联系人图片设置不同的图片,iOS将不允许您这样做。
我遇到的问题:
在用户的联系人中添加新联系人(CNMutableContact
引用)之前,我想向用户显示联系人。我可以使用imageData
设置新联系人的图片。但是,使用CNContactViewController
显示此新联系人时,图片不会按缩略图裁剪。缩略图显示看起来超级怪异和缩放。如何解决这个问题?
<强>解决方案:强>
这是因为thumbnailImageData
对象上的CNMutableContact
属性为零。开发人员无法设置此属性。此属性只能由iOS内部设置,并且在保存联系人时由iOS自动生成。
因此,在显示CNMutableContact
对象之前,您应该将其保存到用户联系人,启动自动缩略图生成,然后立即删除该联系人。
CNMutableContact上的以下扩展描述了您可以采取的措施。
extension CNMutableContact {
func generateThumbnailImage() {
if self.thumbnailImageData != nil {
return
}
// contact.thumbnailImageData is nil
// First save the contact for the thumbnail to be generated
let saveRequest = CNSaveRequest()
saveRequest.add(self, toContainerWithIdentifier: nil)
do {
try CNContactStore().execute(saveRequest)
} catch let error {
print("Error occurred while saving the request \(error)")
}
// self.thumbnailImageData is not nil. Contact Store will generate the thumbnail for this contact with the imageData provided.
// Now delete the contact
let deleteRequest = CNSaveRequest()
deleteRequest.delete(self)
do {
try CNContactStore().execute(deleteRequest)
} catch let error {
print("Error occurred while deleting the request \(error)")
}
// The contact is removed from the Contact Store
// However, the contact.thumbnailImageData is not nil anymore. Contacts Store has generated the thumbnail automatically with the imageData provided.
}
}