TextKit简单用法(图文混排)

原创 2015年07月07日 16:52:00

@interface ViewController ()

{

    UIImageView *imageView;

    UITextView *textView;

}

@property(nonatomic, assign)CGPoint gestureStartingPoint;

@property(nonatomic, assign)CGPoint gestureStartingCenter;


@end

/////////

@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    

    imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"bizhi0403.jpg"]];

    imageView.frame = CGRectMake(0.0, 0.0, 200, 160);

    imageView.userInteractionEnabled = YES;

    imageView.center = self.view.center;

    [self.view addSubview:imageView];

    

    //创建一个平移手势对象,该对象可以调用imagePanned:方法

    UIPanGestureRecognizer *panGes = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(imagePanned:)];

    [imageView addGestureRecognizer:panGes];

    

    textView = [[UITextView alloc] initWithFrame:self.view.bounds];

    textView.backgroundColor = [UIColor whiteColor];

    textView.font = [UIFont systemFontOfSize:24.0];

    textView.text = @"什么是Text KitiOS7中,苹果引入了Text Kit--Text Kit是一个快速而又现代化的文字排版和渲染引擎。Text KitUIKit framework中的定义了一些类和相关协议,它最主要的作用就是为程序提供文字排版和渲染的功能。在程序中,通过Text Kit可以对文字进行存储(store)、布局(lay out),以及用最精细的排版方式(例如文字间距、换行和对齐等)来显示文本内容。 苹果引入Text Kit的目的并非要取代已有的Core TextCore Text的主要作用也是用于文字的排版和渲染中,它是一种先进而又处于底层技术,如果我们需要将文本内容直接渲染到图形上下文(Graphics context)时,从性能和易用性来考虑,最佳方案就是使用Core Text。而如果我们直接利用苹果提供的一些控件(例如UITextViewUILabelUITextField)对文字进行排版,无疑就是借助于UIkit frameworkText Kit提供的API.Text Kit架构下面,我们通过图1(此图来自WWDC2013 Session 210)来了解一下Text Kit的架构。图1是基于iOS 7绘制的,从图中,我们可以看到Text Kit是基于Core Text构建的,它通过Core TextCore Graphics进行交互。而UI控件(UILabelUITextFieldUITextView)则构建于Text Kit之上,可见这些文本控件可以利用Text Kit提供的API来对文字进行排版和渲染处理。 从图中我们也可以看到SDK提供的UIWebView是基于WebKit的,它不能使用Text Kit提供的功能。如图6所示,Text Kit中主要有4个重要的对象。1.Text View是用来显示文本内容的控件,主要包括UILabelUITextViewUITextField2.Text containers对应着NSTextContainer类。NSTextContainer定义了文本可以排版的区域。一般来说,都是矩形区域,当然,也可以根据需求,通过子类化NSTextContainer来创建别的一些形状,例如圆形、不规则的形状等。NSTextContainer不仅可以创建文本可以填充的区域,它还维护着一个数组——该数组定义了一个区域,排版的时候文字不会填充该区域,因此,我们可以在排版文字的时候,填充非文本元素(例如图片,如图4所示)3.Layout manager对应着NSLayoutManager类。该类负责对文字进行编辑排版处理——通过将存储在NSTextStorage中的数据转换为可以在视图控件中显示的文本内容,并把统一的字符编码映射到对应的字形(glyphs)上,然后将字形排版到NSTextContainer定义的区域中。4.Text storage对应着NSTextStorage类。该类定义了Text Kit扩展文本处理系统中的基本存储机制。NSTextStorage继承自NSmutableAttributedString,主要用来存储文本的字符和相关属性。另外,当NSTextStorage中的字符或属性发生了改变,会通知NSLayoutManager,进而做到文本内容的显示更新。";

    [self.view addSubview:textView];

    // 赋路径

    textView.textContainer.exclusionPaths = @[[self translatedBezierPath]];

    

    [self.view bringSubviewToFront:imageView];

}


- (UIBezierPath *)translatedBezierPath

{

    CGRect imageRect = [textView convertRect:imageView.frame fromView:self.view];

    UIBezierPath *path = [UIBezierPath bezierPathWithRect:imageRect];

    return path;

}


- (void)imagePanned:(id)sender

{

    if ([sender isKindOfClass:[UIPanGestureRecognizer class]]) {

        UIPanGestureRecognizer *localSender = sender;

        

        if (localSender.state == UIGestureRecognizerStateBegan) {

            self.gestureStartingPoint = [localSender translationInView:textView];

            self.gestureStartingCenter = imageView.center;

        } else if (localSender.state == UIGestureRecognizerStateChanged) {

            CGPoint currentPoint = [localSender translationInView:textView];

            

            CGFloat distanceX = currentPoint.x - self.gestureStartingPoint.x;

            CGFloat distanceY = currentPoint.y - self.gestureStartingPoint.y;

            

            CGPoint newCenter = self.gestureStartingCenter;

            

            newCenter.x += distanceX;

            newCenter.y += distanceY;

            

            imageView.center = newCenter;

            

            textView.textContainer.exclusionPaths = @[[self translatedBezierPath]];

        } else if (localSender.state == UIGestureRecognizerStateEnded) {

            self.gestureStartingPoint = CGPointZero;

            self.gestureStartingCenter = CGPointZero;

        } 

    } 

}

@end





版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

利用TextKit进行简单的图文混排

最近做的项目属论坛性质,其中大范围的涉及到图文混排,帖子标题前有图片,像“顶”“荐”赏“精”图片,如图: 由此,自已封装了一个工具类,仅做参考: 1,首先上一份完整的代码,业务需求是根据后台返回的标...

TextKit实现图文混排

1.  //    NSAttributedString   这个类可以设置文本属性:加粗、斜体、删除线、下划线... 2.  //   NSMutableAttributedString ...

iOS系列教程之TextKit实现图文混排读后记

前两天看搜狐家明哥写的《TextKit实现图文混排》 今晚回家看了下API发现了一个更加取巧的实现方式.可以直接将后台返回的html富文本用textView显示出来. 记得两年前当时做这个的时候还是...

图文混排(TextKit详解)

iOS7 的发布给开发者的案头带来了很多新工具。其中一个就是 TextKit(文本工具箱)。TextKit 由许多新的 UIKit 类组成,顾名思义,这些类就是用来处理文本的。在这里,我们将介绍 Te...

富文本(图文混排)—— TextKit & CoreText

富文本 图文混排 3种方式: 1.webView 使用简单 负载大 2.CoreText 性能好,功能强大 使用起来复杂 3.TextKit iOS7以后 是对CoreText做了封装...

iOS实现简单图文混排效果

在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式 iOS s...

简单的图文混排

  • 2015-10-27 15:54
  • 266KB
  • 下载

iOS实现简单图文混排效果

在很多新闻类或有文字展示的应用中现在都会出现图文混排的界面例如网易新闻等,乍一看去相似一个网页,其实这样效果并非由UIWebView 加载网页实现。现在分享一种比较简单的实现方式   iO...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)