TextFrame.TextRange.Text 提取ppt里的文字文字有换行,结果提取的内容不全? 在线等求高人指点

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
iOS实现一段文字中部分有下划线,并且可以点击
摘要:项目中有一个需求就是实现一段文字中有几个特殊的字符可以有下划线,并且可以进行点击。首先可以实现下划线效果,首先想到的是UILabel和UITextView控件的NSMutableAttributedString属性,考虑到可能会有点击事件效果的实现,这里选择UITextView控件,因为UITextView有一个功能就是能通过NSRange获得文字的相应的Frame。最终实现这种效果,带下划线的可以点击,点击可以设置背景颜色,也可以不设置背景颜色,可以设置下换线以及下划线上面
项目中有一个需求就是实现一段文字中有几个特殊的字符可以有下划线,并且可以进行点击。首先可以实现下划线效果,首先想到的是UILabel和UITextView控件的 NSMutableAttributedString 属性,考虑到可能会有点击事件效果的实现,这里选择UITextView控件,因为UITextView有一个功能就是能通过NSRange获得文字的相应的Frame。最终实现这种效果,带下划线的可以点击,点击可以设置背景颜色,也可以不设置背景颜色,可以设置下换线以及下划线上面文字的颜色。
实现效果.png
1、首先创建UITextView类
创建UITextView.png
2、ClickTextView类中声明点击回调的block,这里回调用block进行回调
/** 点击回调的block */
typedef void(^clickTextViewPartBlock)(NSString *clickText);
3、介绍下主要的实现方法1&、这个方法主要是将下划线对用的文字的frame,文字内容,点击效果背景颜色存储起来,以供点击的时候查询
* 设置textView的部分为下划线,并且使之可以点击
* @param underlineTextRange 需要下划线的文字范围,如果NSRange范围超出总的内容,将过滤掉
* @param color 下划线的颜色,以及下划线上面文字的颜色
* @param coverColor 是否有点击的背景,如果设置相关颜色的话,将会有点击效果,如果为nil将没有点击效果
* @param block 点击文字的时候的回调
- (void)setUnderlineTextWithRange:(NSRange)underlineTextRange withUnderlineColor:(UIColor *)color withClickCoverColor:(UIColor *)coverColor withBlock:(clickTextViewPartBlock)block
if (self.text.length & underlineTextRange.location+underlineTextRange.length) {
// 设置下划线
[self.content addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:underlineTextRange];
//设置文字颜色
if (color) {
[self.content addAttribute:NSForegroundColorAttributeName value:color range:underlineTextRange];
self.attributedText = self.
// 设置下划线文字的点击事件
// self.selectedRange 影响 self.selectedTextRange
self.selectedRange = underlineTextR
// 获取选中范围内的矩形框
NSArray *selectionRects = [self selectionRectsForRange:self.selectedTextRange];
// 清空选中范围
self.selectedRange = NSMakeRange(0, 0);
// 可能会点击的范围的数组
NSMutableArray *selectedArray = [[NSMutableArray alloc] init];
for (UITextSelectionRect *selectionRect in selectionRects) {
CGRect rect = selectionRect.
if (rect.size.width == 0 || rect.size.height == 0) {
// 将有用的信息打包&存放到字典中&存储到数组中
NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
// 存储文字对应的frame,一段文字可能会有两个甚至多个frame,考虑到文字换行问题
[dic setObject:[NSValue valueWithCGRect:rect] forKey:@&rect&];
// 存储下划线对应的文字
[dic setObject:[self.text substringWithRange:underlineTextRange] forKey:@&content&];
// 存储相应的回调的block
[dic setObject:block forKey:@&block&];
// 存储对应的点击效果背景颜色
[dic setValue:coverColor forKey:@&coverColor&];
[selectedArray addObject:dic];
// 将可能点击的范围的数组存储到总的数组中
[self.rectsArray addObject:selectedArray];
2&、通过一个点击的点,去查找有没有点在下划线对用的文字范围内,并且返回之前打包&存储的字典&的数据模型
- (NSArray *)touchingSpecialWithPoint:(CGPoint)point
// 从所有的特殊的范围中找到点击的那个点
for (NSArray *selecedArray in self.rectsArray) {
for (NSDictionary *dic in selecedArray) {
CGRect myRect = [dic[@&rect&] CGRectValue];
if(CGRectContainsPoint(myRect, point) ){
return selecedA
3&、通过touchesBegan的方法,获取点击的点,并且去查询相关数据模型,并且根据参数是不是展示相应的点击效果,并且通过blcok进行回调
// 点击textView的 touchesBegan 方法
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
// 获取触摸对象
UITouch *touch = [touches anyObject];
CGPoint point = [touch locationInView:self];
// 通过一个触摸点,查询点击的是不是在下划线对应的文字的frame
NSArray *selectedArray = [self touchingSpecialWithPoint:point];
for (NSDictionary *dic in selectedArray) {
if(dic &;&; dic[@&coverColor&]){
UIView *cover = [[UIView alloc] init];
cover.backgroundColor = dic[@&coverColor&];
cover.frame = [dic[@&rect&] CGRectValue];
cover.layer.cornerRadius = 5;
cover.tag = kCoverViewT
[self insertSubview:cover atIndex:0];
if (selectedArray.count) {
// 如果说有点击效果的话,加个延时,展示下点击效果,如果没有点击效果的话,直接回调
NSDictionary *dic = [selectedArray firstObject];
clickTextViewPartBlock block = dic[@&block&];
if (dic[@&coverColor&]) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
block(dic[@&content&]);
block(dic[@&content&]);
4&、点击结束的时候取消点击效果,也就是删除点击的时候创建的view
/** 点击结束的时候 */
- (void)touchesEnded:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
for (UIView *subView in self.subviews) {
if (subView.tag == kCoverViewTag) {
[subView removeFromSuperview];
* 取消点击的时候,清除相关的阴影
- (void)touchesCancelled:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
for (UIView *subView in self.subviews) {
if (subView.tag == kCoverViewTag) {
[subView removeFromSuperview];
4、在ViewController中进行测试
ClickTextView *clickTextView = [[ClickTextView alloc] initWithFrame:CGRectMake(50, 50, 300, 300)];
[self.view addSubview:clickTextView];
// 方便测试,设置textView的边框已经背景
clickTextView.backgroundColor = [UIColor cyanColor];
clickTextView.layer.borderWidth = 1;
clickTextView.layer.borderColor = [UIColor redColor].CGC
clickTextView.font = [UIFont systemFontOfSize:30];
// clickTextView.textColor = [UIColor redColor];
NSString *content = @&承诺书都差不多岁尺布斗粟CBD死UC收不到催上半场低俗&;
// 设置文字
clickTextView.text =
// 设置期中的一段文字有下划线,下划线的颜色为蓝色,点击下划线文字有相关的点击效果
NSRange range1 = [content rangeOfString:@&承诺书都差&];
[clickTextView setUnderlineTextWithRange:range1 withUnderlineColor:[UIColor blueColor] withClickCoverColor:[UIColor greenColor] withBlock:^(NSString *clickText) {
NSLog(@&clickText = %@&,clickText);
// 设置期中的一段文字有下划线,下划线的颜色没有设置,点击下划线文字没有点击效果
NSRange range2 = [content rangeOfString:@&不到催上半场低俗&];
[clickTextView setUnderlineTextWithRange:range2 withUnderlineColor:nil withClickCoverColor:nil withBlock:^(NSString *clickText) {
NSLog(@&clickText = %@&,clickText);
如有失误请各位路过大神即时指点,或有更好的做法,也请指点一二。详情Demo可参考https://github.com/RunOfTheSnail/ClickTextViewPart
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
iOS实现一段文字中部分有下划线,并且可以点击相关信息,包括
的信息,所有iOS实现一段文字中部分有下划线,并且可以点击相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
InternationaliOS文字排版(CoreText)那些事儿
和我们平时说的字体不同,计算机意义上的字体表示的是同一大小,同一样式(Style)字形的集合。从这个意义上来说,当我们为文字设置粗体,斜体时其实是使用了另外一种字体(下划线不算)。而
第一次比较深入接触iOS文字排版相关内容是在12年底,实现某IM项目聊天内容的图文混排,照着nimbus的AttributedLabel和Raywenderlish上的这篇文章《》改出了一个比较适用于聊天内容展现的图文混排(文字和表情)控件。
选择自己写而不是直接使用现有第三方库的原因有三:
1. 在这之前也做过一个iOS上的IM产品,当时这个模块并不是我负责,图文混排的实现非常诡异(通过二分法计算出文字所占区域大小),效率极低,所以需要重新做一个效率比较高的控件出来。
2. 看过一些开源的实现,包括OHAttribtuedLabel,DTCoreText和Nimbus,总觉得他们实现插入图片的接口有点别扭,对于上层调用者来说CoreText部分不是完全透明的:调用者需要考虑怎么用自己的图片把原来内容替换掉。(当时的印象,现在具体怎么样已经不清楚了)
3. 这是重新造轮子的机会!
直接拿了Nimbus的AttributedLabel作为基础,然后重新整理图文混排那部分的代码,调整接口,一共也就花了一个晚上的时间:拜一下Nimbus的作者们。后来也根据项目的需求做了一些小改动,比如hack iOS7下不准的问题,支持在Label上添加UIView的特性等等。最新的代码可以在github上找到:M80AttributedLabel。
不过写这篇文章最重要的原因不是为了放个代码出来,而是在闲暇时整理一下iOS/OSX文字排版相关的知识。&
文字排版的基础概念
字体(Font):和我们平时说的字体不同,计算机意义上的字体表示的是同一大小,同一样式(Style)字形的集合。从这个意义上来说,当我们为文字设置粗体,斜体时其实是使用了另外一种字体(下划线不算)。而平时我们所说的字体只是具有相同设计属性的字体集合,即Font Family或typeface。&
字符(Character)和字形(Glyphs):排版过程中一个重要的步骤就是从字符到字形的转换,字符表示信息本身,而字形是它的图形表现形式。字符一般就是指某种编码,如Unicode编码,而字形则是这些编码对应的图片。但是他们之间不是一一对应关系,同个字符的不同字体族,不同字体大小,不同字体样式都对应了不同的字形。而由于连写(Ligatures)的存在,多个字符也会存在对应一个字形的情况。
字形描述集(Glyphs Metris):即字形的各个参数。如下面的两张图:
边框(Bounding Box):一个假想的边框,尽可能地容纳整个字形。
基线(Baseline):一条假想的参照线,以此为基础进行字形的渲染。一般来说是一条横线。
基础原点(Origin):基线上最左侧的点。
行间距(Leading):行与行之间的间距。
字间距(Kerning):字与字之间的距离,为了排版的美观,并不是所有的字形之间的距离都是一致的,但是这个基本步影响到我们的文字排版。
上行高度(Ascent)和下行高度(Decent):一个字形最高点和最低点到基线的距离,前者为正数,而后者为负数。当同一行内有不同字体的文字时,就取最大值作为相应的值。如下图:
红框高度既为当前行的行高,绿线为baseline,绿色到红框上部分为当前行的最大Ascent,绿线到黄线为当前行的最大Desent,而黄框的高即为行间距。由此可以得出:lineHeight = Ascent + |Decent| + Leading。
更加详细的内容可以参考苹果的这篇文档: 《》。当然如果要做到更完善的排版,还需要掌握段落排版(Paragragh Style)相关的知识,但是如果只是完成聊天框内的文字排版,以上的基础知识已经够用了。详细的段落样式相关知识可以参考: 《》
iOS/OSX中用于描述富文本的类是NSAttributedString,顾名思义,它比NSString多了Attribute的概念。它可以包含很多属性,粗体,斜体,下划线,颜色,背景色等等,每个属性都有其对应的字符区域。在OSX上我们只需解析完毕相应的数据,准备好NSAttributedString即可,底层的绘制完全可以交给相应的控件完成。但是在iOS上就没有这么方便,想要绘制Attributed String就需要用到CoreText了。(当然iOS6之后已经有AttributedLabel了。)
使用CoreText进行NSAttributedString的绘制,最重要的两个概念就是CTFrameSetter和CTFrame。他们的关系如下:&
其中CTFramesetter是由CFAttributedString(NSAttributedString)初始化而来,可以认为它是CTFrame的一个Factory,通过传入CGPath生成相应的CTFrame并使用它进行渲染:直接以CTFrame为参数使用CTFrameDraw绘制或者从CTFrame中获取CTLine进行微调后使用CTLineDraw进行绘制。
一个CTFrame是由一行一行的CLine组成,每个CTLine又会包含若干个CTRun(既字形绘制的最小单元),通过相应的方法可以获取到不同位置的CTRun和CTLine,以实现对不同位置touch事件的响应。
图文混排的实现
CoreText实际上并没有相应API直接将一个图片转换为CTRun并进行绘制,它所能做的只是为图片预留相应的空白区域,而真正的绘制则是交由CoreGraphics完成。(像OSX就方便很多,直接将图片打包进NSTextAttachment即可,根本无须操心绘制的事情,所以基于这个想法,M80AttributedLabel的接口和实现也是使用了attachment这么个概念,图片或者UIView都是被当作文字段中的attachment。)
在CoreText中提供了CTRunDelegate这么个Core Foundation类,顾名思义它可以对CTRun进行拓展:AttributedString某个段设置kCTRunDelegateAttributeName属性之后,CoreText使用它生成CTRun是通过当前Delegate的回调来获取自己的ascent,descent和width,而不是根据字体信息。这样就给我们留下了可操作的空间:用一个空白字符作为图片的占位符,设好Delegate,占好位置,然后用CoreGraphics进行图片的绘制。以下就是整个图文混排代码描述的过程:
-&(void)appendAttachment:&(M80AttributedLabelAttachment&*)attachment&{&&&&&attachment.fontAscent&&&&&&&&&&&&&&&&&&&=&_fontA&&&&&attachment.fontDescent&&&&&&&&&&&&&&&&&&=&_fontD&&&&&unichar&objectReplacementChar&&&&&&&&&&&=&0xFFFC;&&&&&NSString&*objectReplacementString&&&&&&&=&[NSString&stringWithCharacters:&objectReplacementChar&length:1];&&&&&NSMutableAttributedString&*attachText&&&=&[[NSMutableAttributedString&alloc]initWithString:objectReplacementString];&&&&&&CTRunDelegateCallbacks&&&&&&callbacks.version&&&&&&&=&kCTRunDelegateVersion1;&&&&&callbacks.getAscent&&&&&=&ascentC&&&&&callbacks.getDescent&&&&=&descentC&&&&&callbacks.getWidth&&&&&&=&widthC&&&&&callbacks.dealloc&&&&&&&=&deallocC&&&&&&CTRunDelegateRef&delegate&=&CTRunDelegateCreate(&callbacks,&(void&*)attachment);&&&&&NSDictionary&*attr&=&[NSDictionary&dictionaryWithObjectsAndKeys:(__bridge&id)delegate,kCTRunDelegateAttributeName,&nil];&&&&&[attachText&setAttributes:attr&range:NSMakeRange(0,&1)];&&&&&CFRelease(delegate);&&&&&&[_attachments&addObject:attachment];&&&&&[self&appendAttributedText:attachText];&}&
实现委托回调:
CGFloat&ascentCallback(void&*ref)&{&&&&&M80AttributedLabelAttachment&*image&=&(__bridge&M80AttributedLabelAttachment&*)&&&&&CGFloat&ascent&=&0;&&&&&CGFloat&height&=&[image&boxSize].&&&&&switch&(image.alignment)&&&&&{&&&&&&&&&case&M80ImageAlignmentTop:&&&&&&&&&&&&&ascent&=&image.fontA&&&&&&&&&&&&&break;&&&&&&&&&case&M80ImageAlignmentCenter:&&&&&&&&&{&&&&&&&&&&&&&CGFloat&fontAscent&&=&image.fontA&&&&&&&&&&&&&CGFloat&fontDescent&=&image.fontD&&&&&&&&&&&&&CGFloat&baseLine&=&(fontAscent&+&fontDescent)&/&2&-&fontD&&&&&&&&&&&&&ascent&=&height&/&2&+&baseL&&&&&&&&&}&&&&&&&&&&&&&break;&&&&&&&&&case&M80ImageAlignmentBottom:&&&&&&&&&&&&&ascent&=&height&-&image.fontD&&&&&&&&&&&&&break;&&&&&&&&&default:&&&&&&&&&&&&&break;&&&&&}&&&&&return&&}&&CGFloat&descentCallback(void&*ref)&{&&&&&M80AttributedLabelAttachment&*image&=&(__bridge&M80AttributedLabelAttachment&*)&&&&&CGFloat&descent&=&0;&&&&&CGFloat&height&=&[image&boxSize].&&&&&switch&(image.alignment)&&&&&{&&&&&&&&&case&M80ImageAlignmentTop:&&&&&&&&&{&&&&&&&&&&&&&descent&=&height&-&image.fontA&&&&&&&&&&&&&break;&&&&&&&&&}&&&&&&&&&case&M80ImageAlignmentCenter:&&&&&&&&&{&&&&&&&&&&&&&CGFloat&fontAscent&&=&image.fontA&&&&&&&&&&&&&CGFloat&fontDescent&=&image.fontD&&&&&&&&&&&&&CGFloat&baseLine&=&(fontAscent&+&fontDescent)&/&2&-&fontD&&&&&&&&&&&&&descent&=&height&/&2&-&baseL&&&&&&&&&}&&&&&&&&&&&&&break;&&&&&&&&&case&M80ImageAlignmentBottom:&&&&&&&&&{&&&&&&&&&&&&&descent&=&image.fontD&&&&&&&&&&&&&break;&&&&&&&&&}&&&&&&&&&default:&&&&&&&&&&&&&break;&&&&&}&&&&&&return&&&}&&CGFloat&widthCallback(void*&ref)&{&&&&&M80AttributedLabelAttachment&*image&&=&(__bridge&M80AttributedLabelAttachment&*)&&&&&return&[image&boxSize].&}&
真正的绘制:
-&(void)drawAttachments&{&&&&&if&([_attachments&count]&==&0)&&&&&{&&&&&&&&&return;&&&&&}&&&&&CGContextRef&ctx&=&UIGraphicsGetCurrentContext();&&&&&if&(ctx&==&nil)&&&&&{&&&&&&&&&return;&&&&&}&&&&&&CFArrayRef&lines&=&CTFrameGetLines(_textFrame);&&&&&CFIndex&lineCount&=&CFArrayGetCount(lines);&&&&&CGPoint&lineOrigins[lineCount];&&&&&CTFrameGetLineOrigins(_textFrame,&CFRangeMake(0,&0),&lineOrigins);&&&&&NSInteger&numberOfLines&=&[self&numberOfDisplayedLines];&&&&&for&(CFIndex&i&=&0;&i&&&numberOfL&i++)&&&&&{&&&&&&&&&CTLineRef&line&=&CFArrayGetValueAtIndex(lines,&i);&&&&&&&&&CFArrayRef&runs&=&CTLineGetGlyphRuns(line);&&&&&&&&&CFIndex&runCount&=&CFArrayGetCount(runs);&&&&&&&&&CGPoint&lineOrigin&=&lineOrigins[i];&&&&&&&&&CGFloat&lineA&&&&&&&&&CGFloat&lineD&&&&&&&&&CTLineGetTypographicBounds(line,&&lineAscent,&&lineDescent,&NULL);&&&&&&&&&CGFloat&lineHeight&=&lineAscent&+&lineD&&&&&&&&&CGFloat&lineBottomY&=&lineOrigin.y&-&lineD&&&&&&&&&&&&&&&&&&&&&&&&&&&&for&(CFIndex&k&=&0;&k&&&runC&k++)&&&&&&&&&{&&&&&&&&&&&&&CTRunRef&run&=&CFArrayGetValueAtIndex(runs,&k);&&&&&&&&&&&&&NSDictionary&*runAttributes&=&(NSDictionary&*)CTRunGetAttributes(run);&&&&&&&&&&&&&CTRunDelegateRef&delegate&=&(__bridge&CTRunDelegateRef)[runAttributes&valueForKey:(id)kCTRunDelegateAttributeName];&&&&&&&&&&&&&if&(nil&==&delegate)&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&continue;&&&&&&&&&&&&&}&&&&&&&&&&&&&M80AttributedLabelAttachment*&attributedImage&=&(M80AttributedLabelAttachment&*)CTRunDelegateGetRefCon(delegate);&&&&&&&&&&&&&&CGFloat&ascent&=&0.0f;&&&&&&&&&&&&&CGFloat&descent&=&0.0f;&&&&&&&&&&&&&CGFloat&width&=&(CGFloat)CTRunGetTypographicBounds(run,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&CFRangeMake(0,&0),&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ascent,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&descent,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&NULL);&&&&&&&&&&&&&&CGFloat&imageBoxHeight&=&[attributedImage&boxSize].&&&&&&&&&&&&&CGFloat&xOffset&=&CTLineGetOffsetForStringIndex(line,&CTRunGetStringRange(run).location,&nil);&&&&&&&&&&&&&&CGFloat&imageBoxOriginY&=&0.0f;&&&&&&&&&&&&&switch&(attributedImage.alignment)&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&case&M80ImageAlignmentTop:&&&&&&&&&&&&&&&&&&&&&imageBoxOriginY&=&lineBottomY&+&(lineHeight&-&imageBoxHeight);&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&case&M80ImageAlignmentCenter:&&&&&&&&&&&&&&&&&&&&&imageBoxOriginY&=&lineBottomY&+&(lineHeight&-&imageBoxHeight)&/&2.0;&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&&&&&case&M80ImageAlignmentBottom:&&&&&&&&&&&&&&&&&&&&&imageBoxOriginY&=&lineBottomY;&&&&&&&&&&&&&&&&&&&&&break;&&&&&&&&&&&&&}&&&&&&&&&&&&&&CGRect&rect&=&CGRectMake(lineOrigin.x&+&xOffset,&imageBoxOriginY,&width,&imageBoxHeight);&&&&&&&&&&&&&UIEdgeInsets&flippedMargins&=&attributedImage.&&&&&&&&&&&&&CGFloat&top&=&flippedMargins.&&&&&&&&&&&&&flippedMargins.top&=&flippedMargins.&&&&&&&&&&&&&flippedMargins.bottom&=&&&&&&&&&&&&&&&CGRect&attatchmentRect&=&UIEdgeInsetsInsetRect(rect,&flippedMargins);&&&&&&&&&&&&&&id&content&=&attributedImage.&&&&&&&&&&&&&if&([content&isKindOfClass:[UIImage&class]])&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&CGContextDrawImage(ctx,&attatchmentRect,&((UIImage&*)content).CGImage);&&&&&&&&&&&&&}&&&&&&&&&&&&&else&if&([content&isKindOfClass:[UIView&class]])&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&UIView&*view&=&(UIView&*)&&&&&&&&&&&&&&&&&if&(view.superview&==&nil)&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&[self&addSubview:view];&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&CGRect&viewFrame&=&CGRectMake(attatchmentRect.origin.x,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&self.bounds.size.height&-&attatchmentRect.origin.y&-&attatchmentRect.size.height,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&attatchmentRect.size.width,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&attatchmentRect.size.height);&&&&&&&&&&&&&&&&&[view&setFrame:viewFrame];&&&&&&&&&&&&&}&&&&&&&&&&&&&else&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&NSLog(@&Attachment&Content&Not&Supported&%@&,content);&&&&&&&&&&&&&}&&&&&&&&&&}&&&&&}&}&
详细的代码可以直接在github上查看:
CocoaChina是全球最大的苹果开发中文社区,官方微信每日定时推送各种精彩的研发教程资源和工具,介绍app推广营销经验,最新企业招聘和外包信息,以及Cocos2d引擎、Cocos Studio开发工具包的最新动态及培训信息。关注微信可以第一时间了解最新产品和服务动态,微信在手,天下我有!
请搜索微信号“CocoaChina”关注我们!
关注微信 每日推荐
扫一扫 浏览移动版豆丁微信公众号
君,已阅读到文档的结尾了呢~~
VFP自动生成POWERPOINT演示文稿
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
VFP自动生成POWERPOINT演示文稿
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
一河两寺三桥四川大学
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
又是雨天没法出去活动~无聊想到个NEW IDEA!说做就做~
Slide 1锁屏画面,启动后,获取当前时间,滑块旁边是gif动画图片一张。
Slide 2解锁,动作路径滑动解锁,gif动画淡出,自动切换Slide。
Slide 3进入桌面,软件图标及下方的Dock动画进入。
Slide 4脉冲一次某个图标,图片动画切出,显示主标题,然后再收回。
Slide 5keynote图标旋陀螺5~6°,自动翻转,重复几次,然后从屏幕中心放大一半透明黑色矩形【动画-缩放,或形状-缩小、方框】或者使用【切换-形状-切出】,上方状态条由半透明变黑背景色,接着就是显示演示内容,开始啦~
各Slide的统一用文本框显示时间,并在选择窗格里把形状命名为time,因为插入时间选自动更新只能显示开始演示的时间,也就是说不管你播放多久,都只显示一个值,因此各Slide都用宏动态更新时间值。PowerPoint插入自动更新的时间的问题看本文最后。
切换Slide时运行宏参照博文:
自定义时间格式参照博文:
提供2种方法播放幻灯片时动态更新时间值,以下代码放模块里:
Sub OnSlideShowPageChange()' 每一张Slide都必须有名为time的Shape' 也可以先判断是否存在,或者用On Error处理
' 每切换一次更新全部Slide,by oicu'&& On Error Resume Next'&& 循环用Resume不用GoTo'&& For i = 1 To Application.ActivePresentation.Slides.Count'&&&&&& ActivePresentation.Slides(i).Shapes.Range("time"). _'&&&&&&&& TextFrame.TextRange.Text = Format(Time, "hh:mm")'&& Next
' 只更新当前Slide,by oicu&&& On Error GoTo Err&&& Application.SlideShowWindows(1).View.Slide.Shapes. _&&&&& Range("time").TextFrame.TextRange.Text = _&&&&& Format(Time, "hh:mm")Err:End Sub
电池表示进度,开始100%,电池耗完当然就是演示结束啦,同样,百分比及电池图标也用宏来控制,制作的时候运行一次即可。
进度条制作参照博文:
最后要特别强调,图片素材来自:
为什么不把时间的文本框以及进度条做到母板里?电池进度条及百分比只需生成一次,放到母板里每次切换都执行宏,太麻烦也浪费资源,而且容易出错,测试时发现只更新母板或者版式的内容是不行的!可以使用以下宏测试时间有问题:
Sub OnSlideShowPageChange()&&& Application.ActivePresentation.SlideMaster.Shapes. _&&&&& Range("time").TextFrame.TextRange.Text = _&&&&& Format(Time, "hh:mm:ss")
'&& 也可以用SlideLayout15.Shapes.Range……这样设置版式的内容&&& Application.ActivePresentation.SlideMaster. _&&&&& CustomLayouts.Item(2). _&&&&& Shapes.Range("time").TextFrame. _&&&&& TextRange.Text = Format(Time, "hh:mm:ss")End Sub&
视频所示的PPT文档不会公布,所用的宏代码已经在其他日志里公开。
PS:大家不用留邮箱了,这个PPT从来就没有公开过,之前留言的
只是拿进度条宏的示例,没有任何iPad的界面的,我也不会单独
再发邮件,都是些简单的动画,相信很多人都比我做得好。
【为什么用宏更新时间】
在我机子里,微软PowerPoint 一直有一个Bug:
在页脚里插入日期和时间(显示秒),即使选择自动更新,未放映时切换幻灯片时间不会更新,放映后,前后切换幻灯片,时间显示不对。
在母版(不是版式)里插入文本框,再添加日期和时间,也选择自动更新,退出母版编辑后,未放映时切换幻灯片也能更新时间,但放映后,时间也会不对。
一直往后播放问题不大,放映后,如果按了上一张的操作,很容易发现这个问题,但 WPS 2013 不会出现时间自动更新出错的问题。
阅读(11831)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'仿iPad界面的PPT——动态更新幻灯片内容',
blogAbstract:'\r\n本文链接:
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 伟大的悲剧ppt课件 的文章

 

随机推荐