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

时间:2017-03-27 19:19:09

标签: ios swift3 cncontact

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

代码:

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

如何添加自定义thumbnailImage裁剪?

1 个答案:

答案 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.
    }
}