如何为 CNMutableContact 的 `thumbnailImageData` 设置裁剪信息

How to set crop information for `thumbnailImageData` of CNMutableContact

我 create/update 联系人,使用 CNMutableContact。 我可以通过 imageData 属性 设置新图像,但我需要设置自定义裁剪信息以创建缩略图。 属性 thumbnailImageData 是只读的。

代码:

let cnContact = CNMutableContact()
cnContact.imageData = imageData //created before

如何添加自定义缩略图裁剪?

在iOS中似乎无法设置缩略图。但是,根据定义,图像的缩略图是裁剪到较小尺寸的同一图像。因此 iOS 将在保存联系人时自动从联系人上设置的图像数据生成缩略图。

如果您想为缩略图和实际联系人图像设置不同的图像,iOS 不允许您这样做。

我遇到的问题:

在用户的联系人中添加新联系人(CNMutableContact参考)之前,我想向用户显示联系人。我可以使用 imageData 来设置新联系人的图像。但是,当使用 CNContactViewController 显示此新联系人时,图像不会按照缩略图进行裁剪。显示的缩略图看起来非常奇怪并且缩放。如何解决?

解法:

这是因为 CNMutableContact 对象上的 thumbnailImageData 属性 为 nil。这个 属性 不能由开发者设置。此 属性 只能由 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.
    }
}