技术交流和心得分享16.1.19"/>
蓝懿ios技术交流和心得分享16.1.19
iOS sdk中为我们提供了一套完善的文字排版开发组件
:CoreText。CoreText库中提供了很多的工具来对文本进行操作,例如CTFont、CTLine、CTFrame等。利用这些工具可以对文字字体每一行每一段落进行操作。
此例中默认图片都在右上方,且为了美观和开发简便设定所占宽度都相同。
1. 首先,需要引入CoreText库
在需要使用的类文件中添加#import 头文件。
2. 设置文本的参数
创建一个NSMutableAttributedString对象,包含所需展示的文本字符串。这样就可以对其进行设置了。通过CTFontCreateWithName函数创建一个CTFont对象,利用NSMutableAttributedString对象的addAttribute方法进行设置。类似的方法可以设置字间距。
对其方式与行间距的设置方式:
[cpp] view plain
copy
?
- // 文本对齐方式
- CTTextAlignment alignment = kCTLeftTextAlignment;
- CTParagraphStyleSetting alignmentStyle;
- alignmentStyle.spec = kCTParagraphStyleSpecifierAlignment;
- alignmentStyle.valueSize = sizeof
(alignment);
- alignmentStyle.value = &alignment;
- // 创建设置数组
- CTParagraphStyleSetting settings[] ={alignmentStyle};
- CTParagraphStyleRef style = CTParagraphStyleCreate(settings, 1);
同样使用addAttribute设置字符串对象。这样的方法还可以设置行间距,段间距等参数。
3. 计算图片所占高度。图片可以使用UIImageView 来进行显示。很容易便可获取每张图片所占总高度。
4. 由于图片宽度是固定的这样就可以计算每行文字缩短的字数。只要文本的总体高度低于图像总高度则文字长度都是缩短的。用CTTypesetterSuggestLineBreak函数动态的计算每一行里的字数,因为每一行里面的中文字、标点符号、数字、字母都不一样所以可以显示的字数肯定也是不同的,所以需要作这样的计算。这样循环直至文本结束,就可以知道有多少行字了。再根据字体高度和行间距得出总的文本高度,如果文本高度大于图片总高度那么显示区域的Frame高度就是文本的高度,反之亦然。
5. 绘制文本:
设置每一行绘制文本的区间:
[cpp]
view plaincopyprint?
- CFRange lineRange = CFRangeMake(currentIndex, lineLength);
- 建立文本行对象
- CTLineRef line = CTTypesetterCreateLine(typeSetter, lineRange);
- CGFloat x = [self textOffsetForLine:line inRect:self.bounds];
- // 设置一行的位置
- CGContextSetTextPosition(context, x, y);
- // 绘制一行文字
- CTLineDraw(line, context);
6. 其他功能:
在完成文本绘制功能后可以加入调整文字大小的功能,和图片的放大的功能。
文字大小可以通过直接设置字体大小后重新绘制文本来实现。
图片放大可以在视图上添加一个新的UIImageView 来展示放大后的图片,并且加入动画效
如何发送本地推送通知
推送通知也属于UI的一部分,所以推送通知对象是以UI开头。
将发送通知的代码方法控制器的-touchesBegan: withEvent: 中测试比较合适,如果放到viewDidLoad方法,用户的注册请求还没有完成方法就调用了。
创建本地通知对象
1
2
// 创建本地通知对象
UILocalNotification*ln=[[UILocalNotification alloc]init];
设置本地通知属性
// 1.设置通知的内容(如果此属性不设置是不会发送通知的)
ln.alertBody=@"小明,你妈叫你回家吃饭了!";
// 2.设置通知触发的开始时间
ln.fireDate=[NSDate dateWithTimeIntervalSinceNow:3];
// 3.设置重复通知的时间,间隔
ln.repeatInterval=NSCalendarUnitSecond;
// 4.设置重复执行使用日历(用户设置的日历)
ln.repeatCalendar=[NSCalendar currentCalendar];
// NSString * const NSGregorianCalendar; 公历
// NSString * const NSChineseCalendar; 农历
// ln.repeatCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar];
// 5.设置应用图标右上角的数字
ln.applicationIconBadgeNumber=3;
// 6.设置点击推送通知进入界面的时候显示,加载图片
ln.alertLaunchImage=@"";
// 7 设置通知的音效(只有真机有效)
local.soundName=UILocalNotificationDefaultSoundName;
// 8 设置一些额外信息
local.userInfo=@{@"QQ":@"55555",@"info":@"约了没"};
// iOS8.0 以后新增属性
// ************************************
// 1.设置区域,进入或离开某个区域的时候触发
// CLLocationCoordinate2D coordinate = CLLocationCoordinate2DMake(40.1,106.1);
// ln.region = [[CLCircularRegion alloc] initWithCenter:coordinate radius:10.0 identifier:@"ab"];
// 2.设置进入或离开某个区域只执行一次
// ln.regionTriggersOnce = YES;
// ***************************************
// iOS8.2 新增属性
// ln.alertTitle = @"通知标题";
使用应用 UIApplication 调度本地通知
1
2
// 让应用调度通知
[[UIApplication sharedApplication]scheduleLocalNotification:ln];
本地推送通知页面跳转
无论应用是在前台,后台还是已经关闭都能如期接收到本地通知,但是当用户点击通知进入应用的时候,我们需要根据不同情况,进行处理
AppDelegate本地通知代理方法
-(void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)notification{
// 当应用在前台时候什么都不做
更多推荐
蓝懿ios技术交流和心得分享16.1.19
发布评论