MBContactPicker 0.2.4

MBContactPicker 0.2.4

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2015年10月

Matt Bowman 维护。



  • 作者
  • Matt Bowman 和 Matt Hupman

摘要

MBContactPicker 是一个类似于 iOS7 中邮件应用中联系人选择器的实现。它可以轻松地插入到任何项目中,只需要使用界面构建器和几行简单的代码,你就可以在非常短的时间内将这个自定义联系人选择器添加到您的应用中。

我编写这个库是为了更新我们公司过去使用的令人惊叹的 THContactPicker。我创建这个库的主要目标是创建一个在行为和感觉上类似于原生邮件应用的联系人选择器的库。

我的次要目标是使其使用非常简单,同时仍然提供高度的可定制性,以满足需要这种特性的项目。

Animated GIF of Contact Picker

使用

示例

下面是一个使用 MBContactPicker 的视图控制器的基本示例。

#import "ViewController.h"
#import "ContactObject.h"
#import "MBContactPicker.h"

@interface ViewController () <MBContactPickerDataSource, MBContactPickerDelegate>

@property (nonatomic) NSArray *contacts;
@property (weak, nonatomic) IBOutlet MBContactPicker *contactPickerView;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contactPickerViewHeightConstraint;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *array = @[
                       @{@"Name":@"Contact 1", @"Title":@"CTO"},
                       @{@"Name":@"Contact 2", @"Title":@"CEO"}
                       ];

    NSMutableArray *contacts = [[NSMutableArray alloc] initWithCapacity:array.count];
    for (NSDictionary *contact in array)
    {
        ContactObject *model = [[ContactObject alloc] init];
        model.contactTitle = contact[@"Name"];
        model.contactSubtitle = contact[@"Title"];
        [contacts addObject:model];
    }
    self.contacts = contacts;

    self.contactPickerView.delegate = self;
    self.contactPickerView.datasource = self;
}

#pragma mark - MBContactPickerDataSource

// Use this method to give the contact picker the entire set of possible contacts.  Required.
- (NSArray *)contactModelsForContactPicker:(MBContactPicker*)contactPickerView
{
    return self.contacts;
}

// Use this method to pre-populate contacts in the picker view.  Optional.
- (NSArray *)selectedContactModelsForContactPicker:(MBContactPicker*)contactPickerView
{
    return @[];
}

#pragma mark - MBContactPickerDelegate

// Optional
- (void)contactCollectionView:(MBContactCollectionView*)contactCollectionView didSelectContact:(id<MBContactPickerModelProtocol>)model
{
    NSLog(@"Did Select: %@", model.contactTitle);
}

// Optional
- (void)contactCollectionView:(MBContactCollectionView*)contactCollectionView didAddContact:(id<MBContactPickerModelProtocol>)model
{
    NSLog(@"Did Add: %@", model.contactTitle);
}

// Optional
- (void)contactCollectionView:(MBContactCollectionView*)contactCollectionView didRemoveContact:(id<MBContactPickerModelProtocol>)model
{
    NSLog(@"Did Remove: %@", model.contactTitle);
}

// Optional
// This delegate method is called to allow the parent view to increase the size of
// the contact picker view to show the search table view
- (void)didShowFilteredContactsForContactPicker:(MBContactPicker*)contactPicker
{
    if (self.contactPickerViewHeightConstraint.constant <= contactPicker.currentContentHeight)
    {
        [UIView animateWithDuration:contactPicker.animationSpeed animations:^{
            CGRect pickerRectInWindow = [self.view convertRect:contactPicker.frame fromView:nil];
            CGFloat newHeight = self.view.window.bounds.size.height - pickerRectInWindow.origin.y - contactPicker.keyboardHeight;
            self.contactPickerViewHeightConstraint.constant = newHeight;
            [self.view layoutIfNeeded];
        }];
    }
}

// Optional
// This delegate method is called to allow the parent view to decrease the size of
// the contact picker view to hide the search table view
- (void)didHideFilteredContactsForContactPicker:(MBContactPicker*)contactPicker
{
    if (self.contactPickerViewHeightConstraint.constant > contactPicker.currentContentHeight)
    {
        [UIView animateWithDuration:contactPicker.animationSpeed animations:^{
            self.contactPickerViewHeightConstraint.constant = contactPicker.currentContentHeight;
            [self.view layoutIfNeeded];
        }];
    }
}

// Optional
// This delegate method is invoked to allow the parent to increase the size of the
// collectionview that shows which contacts have been selected. To increase or decrease
// the number of rows visible, change the maxVisibleRows property of the MBContactPicker
- (void)contactPicker:(MBContactPicker*)contactPicker didUpdateContentHeightTo:(CGFloat)newHeight
{
    self.contactPickerViewHeightConstraint.constant = newHeight;
    [UIView animateWithDuration:contactPicker.animationSpeed animations:^{
        [self.view layoutIfNeeded];
    }];
}

@end

联系人对象

用于 MBContactPickerDataSourceMBContactPickerDelegate 协议中的联系人对象必须符合 id<MBContactPickerModelProtocol> 协议。您可以使用提供的便捷的基本实现 MBContactModel,或者根据以下示例调整您的模型类,以符合 id<MBContactPickerModelProtocol>

#import "MBContactModel.h"

@interface MyContactObject : NSObject <MBContactPickerModelProtocol>
...
// Required
@property (nonatomic, copy) NSString *contactTitle;
// Optional
@property (nonatomic, copy) NSString *contactSubtitle;
@property (nonatomic) UIImage *contactImage;
...
@end

自定义/配置

更改选中联系人的颜色

感谢 Roman 为此增强做了贡献。

[[ContactCollectionViewCell appearance] setTintColor:[UIColor orangeColor]];

Orange Colored Contacts

附加外观设置

您还可以设置输入文本和提示的颜色。

[[MBContactCollectionViewPromptCell appearance] setTintColor:[UIColor redColor]];
[[MBContactCollectionViewEntryCell appearance] setTintColor:[UIColor purpleColor]];

抑制已选中联系人的完成

默认情况下,选择器会向您显示已添加到集合中的联系人作为完成选项,但在您选择它们时丢弃它们,以防止集合中出现重复联系人。这是符合苹果的 Mail.app 行为,但可以说是用户体验的一个缺陷。为了从完成列表中抑制已经选择的联系人,您可以设置以下属性

self.contactPickerView.allowsCompletionOfSelectedContacts = NO;

启用/禁用

可以通过设置其-enabled属性来切换MBContactPicker控件的启用状态。MBContactCollectionView有两个属性,分别是-allowsSelection-allowsTextInput,分别用于控制是否可以选择/删除联系人单元格和进行搜索/添加新联系人。

UIResponder

MBContactPickerMBContactCollectionView都遵循UIResponder协议。请勿使用objc_msgSend来调用becomeFirstResponderresignFirstResponder方法!

自定义提示

修改MBContactPicker.prompt以更改默认的@"To:"提示值。将MBContactPicker.showPrompt设置为NO来完全移除提示。为了支持国际化(i18n),提示文本可以通过Localizable.strings文件中的"MBContactPickerPrompt"键自定义。

通过代码添加联系人选择器

如果您必须通过代码添加MBContactPicker,则需要手动添加约束(首选)或将translatesAutoresizingMaskIntoConstraints设置为YES,然后设置框架。更多详细信息,请参阅此注释

动机

这个项目存在的原因是因为没有其他 cocoapods 可以解决这样一个问题:提供一个强大而易于实现的联系人选择器,使用最新的 iOS 工具,并且与 iOS7 的扁平设计相符。

安装

将以下行添加到您的 PodFile

pod 'MBContactPicker'

贡献者

我正在积极维护这个项目,并与Citrrus团队一起工作,所以请fork我们的项目并让其变得更好!

特别感谢Matt Hupman为这个库 덕분에,并为此项目提供了反馈和PR以改进它。

许可证

本项目使用MIT许可证,因此没有任何附加条件。