MBContactPicker 是一个类似于 iOS7 中邮件应用中联系人选择器的实现。它可以轻松地插入到任何项目中,只需要使用界面构建器和几行简单的代码,你就可以在非常短的时间内将这个自定义联系人选择器添加到您的应用中。
我编写这个库是为了更新我们公司过去使用的令人惊叹的 THContactPicker。我创建这个库的主要目标是创建一个在行为和感觉上类似于原生邮件应用的联系人选择器的库。
我的次要目标是使其使用非常简单,同时仍然提供高度的可定制性,以满足需要这种特性的项目。
下面是一个使用 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
用于 MBContactPickerDataSource
和 MBContactPickerDelegate
协议中的联系人对象必须符合 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]];
您还可以设置输入文本和提示的颜色。
[[MBContactCollectionViewPromptCell appearance] setTintColor:[UIColor redColor]];
[[MBContactCollectionViewEntryCell appearance] setTintColor:[UIColor purpleColor]];
默认情况下,选择器会向您显示已添加到集合中的联系人作为完成选项,但在您选择它们时丢弃它们,以防止集合中出现重复联系人。这是符合苹果的 Mail.app
行为,但可以说是用户体验的一个缺陷。为了从完成列表中抑制已经选择的联系人,您可以设置以下属性
self.contactPickerView.allowsCompletionOfSelectedContacts = NO;
可以通过设置其-enabled
属性来切换MBContactPicker
控件的启用状态。MBContactCollectionView
有两个属性,分别是-allowsSelection
和-allowsTextInput
,分别用于控制是否可以选择/删除联系人单元格和进行搜索/添加新联系人。
MBContactPicker
和MBContactCollectionView
都遵循UIResponder协议。请勿使用objc_msgSend
来调用becomeFirstResponder
和resignFirstResponder
方法!
修改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许可证,因此没有任何附加条件。