iOS 玩转微信——通讯录

本文详细介绍了如何在iOS中实现高仿微信通讯录功能,包括数据处理(汉字转拼音、按字母分组)、页面展示的细节,如背景色处理、侧滑删除、索引Bar实现。同时讨论了滚动过程中的背景色和文字颜色渐变,以及搜索模块的显示和隐藏动画。通过学习此项目,可以掌握iOS原生API和第三方库的运用。
摘要由CSDN通过智能技术生成

概述

  • 2019年初--至今,笔者为求生计,被迫转学Vue开发,老兵不死,只会逐渐凋零,以致于渐渐冷落了iOS开发,毕竟有舍便有得,不逼自己一把,也不知道自己有多优秀。

  • 由于大家对 WeChat 中运用的MVVM + RAC + ViewModel-Based Navigation的模式比较感兴趣,但是此前此项目主要是用于团队内部交流使用,主要介绍了其中使用技巧和实用技术,以及一些细节处理,实用为主,功能为辅。

  • 尽管实现了微信的整体架构,以及朋友圈等功能,但是其中还是充斥着不少测试代码,这让整体项目看起来像个Demo,并且不够优美,随着微信 7.0.0+的出现,整体UI也发生了翻天覆地的变化,所以,只好痛定思痛,重蹈覆辙,重拾iOS,这里先以高仿微信通讯录为例,宣告笔者强势复出,后期争取尽自己最大努力,98%还原真实微信开发,不断剖析其中的技术实现和细节处理。

  • 笔者希望通过学习和实践这个项目,也能够打开学习ReactiveCocoa + MVVM的大门。当然同时也是抛砖引玉,摆渡众生、取长补短,希望能够提供一点思路,少走一些弯路,填补一些细坑,在帮助他人的过程中,收获分享技术的乐趣。

  • 源码地址:WeChat

预览

索引 侧滑
ios_contacts_page_0.png ios_contacts_page_1.png
GIF
ios_contacts_page.gif

功能

通讯录模块,尽管UI看起来极其简单,但是涵盖不少知识点,也是通讯录模块的功能所在,本篇文章将详述以下知识点以及实现的细节:

  • 汉字转拼音数据排序按字母分组
  • 底部上拉显示白底
  • A-Z 索引Bar索引联动悬停HeaderView渐变
  • Cell 侧滑备注修改侧滑样式

分析

数据处理

首先,主要是将联系人姓名转成拼音,然后取联系人拼音首字母;其次,利用字典(NSDictionary)的key的唯一性,将联系人的首字母插入到字典当中去;最后,取出字典的allKeys进行字母排序,然后遍历数据,进行按字母分组。

这里的核心技术就是汉字转拼音,当然大家可以使用iOS原生库方法PinYin4Objc来实现,这里笔者主要讲讲,iOS原生提供的API:

/// string 要转换的string,比如要转换的中文,同时它是mutable的,因此也直接作为最终转换后的字符串。
/// range是要转换的范围,同时输出转换后改变的范围,如果为NULL,视为全部转换。
/// transform可以指定要进行什么样的转换,这里可以指定多种语言的拼写转换。
/// reverse指定该转换是否必须是可逆向转换的。
/// 如果转换成功就返回true,否则返回false
Boolean CFStringTransform(CFMutableStringRef string, CFRange *range, CFStringRef transform, Boolean reverse);
CFMutableStringRef string = CFStringCreateMutableCopy(NULL, 0, CFSTR("芈月"));
CFStringTransform(string, NULL, kCFStringTransformMandarinLatin, NO);
NSLog(@"%@",string);
/// 打印结果:mǐ yuè

/// 由于👆正确的输出了拼音,而且还带上了音标。有时候我们不需要音标怎么办?还好CFStringTransform同时提供了将音标字母转换为普通字母的方法kCFStringTransformStripDiacritics。我们在上面的代码基础上再加上这个:

CFStringTransform(string, NULL, kCFStringTransformStripDiacritics, NO);
NSLog(@"%@",string);
/// 打印结果:mi yue

由于后期考虑到,搜索模块需要增加本地搜索联系人的需求,所以本项目这里采用了内部已经封装好 PinYin4ObjcHighlightedSearch,它支持搜索关键字,高亮显示,支持汉字、全拼、简拼搜索,支持多音字搜索。

汉子转拼音API如下:

/// WPFPinYinTools.h
/** 获取传入字符串的第一个拼音字母 */
+ (NSString *)firstCharactor:(NSString *)aString withFormat:(HanyuPinyinOutputFormat *)pinyinFormat;

数据处理整体代码如下:

/// 联系人数据处理
- (void)_handleContacts:(NSArray *)contacts {
    if (MHObjectIsNil(contacts) || contacts.count == 0) return;
    
    // 计算总人数
    self.total = [NSString stringWithFormat:@"%ld位联系人",contacts.count];
    
    
    // 这里需要处理数据
    NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] init];
    
    // 获取首字母
    for(MHUser *contact in contacts){
     
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值