IOS7 textkit 的相关

去年基于5.0开发的时候,自己用coreText编写了一个富文本,所有的效果都实现的很好。但是没有去测试效率,不过在cell重用的时候表现不错,在4s上面也不会卡顿。

唯一一个问题就是,在使用AL的时候,不方便。所以,此次新版本是基于7.0开发。决定使用textkit重新编写一次。

下面是一些基本的使用:

@interface MMTextAttachment : NSTextAttachment
{

}

@end

@implementation MMTextAttachment

//I want my emoticon has the same size with line's height
- (CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex NS_AVAILABLE_IOS(7_0)
{
    NSLog(@"\n lineFrag={%f,%f,%f,%f} \n",lineFrag.origin.x,lineFrag.origin.y,lineFrag.size.width,lineFrag.size.height);
    NSLog(@"\n glyphPosition={%f,%f} \n",position.x,position.y);
    CGFloat lineHeight = lineFrag.size.height;
    CGFloat abc = 21.0;
    return CGRectMake( 0 , (lineHeight - abc)/2.0 , abc , abc);
}

可以使用UITextView 或 UILabel,但是UITextView可以检测链接等,下面先看下UITextView

// 点击处理
    // http://stackoverflow.com/questions/19332283/detecting-taps-on-attributed-text-in-a-uitextview-on-ios-7
    NSMutableAttributedString * string = [[ NSMutableAttributedString alloc ] initWithString:@"[email protected]谭中洞 2345678910 http://gutou.com 1112what happendwhatg一个地址 重庆市渝中区210号 02364646464 happendwhat happendwhat happendwhat happendwhat happend This is an example by @marcelofabri_ #abcdef "  attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:14.0]} ] ;
    MMTextAttachment * textAttachment = [[ MMTextAttachment alloc ] initWithData:nil ofType:nil ] ;
    textAttachment.image = [UIImage imageNamed:@"002.png"] ;
    NSAttributedString * textAttachmentString = [ NSAttributedString attributedStringWithAttachment:textAttachment ] ;
    [string insertAttributedString:textAttachmentString atIndex:7] ;

    MMTextAttachment * textAttachmen2t = [[ MMTextAttachment alloc ] initWithData:nil ofType:nil ] ;

    [[SDWebImageManager sharedManager] downloadImageWithURL:[NSURL URLWithString:@"https://www.baidu.com/img/baidu_jgylogo3.gif?v=27357745.gif"] options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
        // 使用网络下载,下载完成后,重新刷新下这个range
        textAttachmen2t.image = image;
        [_textView.layoutManager invalidateDisplayForCharacterRange:NSMakeRange(57, 1)]; // UILabel可以使用<span style="font-family: monospace; white-space: pre; background-color: rgb(240, 240, 240);">setNeedsDisplay
</span>    }];

    NSAttributedString * textAttachmentStr2ing = [ NSAttributedString attributedStringWithAttachment:textAttachmen2t ] ;
    [string insertAttributedString:textAttachmentStr2ing atIndex:57] ;
    //
    NSRange range1 = [[string string] rangeOfString:@"@marcelofabri_"];
    [string addAttribute:NSLinkAttributeName
                   value:@"URL://jsonstring"
                   range:range1];
    NSLog(@"\n range1 = %@ \n",NSStringFromRange(range1));
    NSRange range2 = [[string string] rangeOfString:@"#abcdef "];
    [string addAttribute:NSLinkAttributeName
                   value:@"URL://jsonstring"
                   range:range2];
    NSLog(@"\n range2 = %@ \n",NSStringFromRange(range2));

//    [string addAttributes:@{NSForegroundColorAttributeName: [UIColor blueColor]} range:range1];
//    [string addAttributes:@{NSForegroundColorAttributeName: [UIColor greenColor]} range:range2];

    /*
     // 自定link的颜色
     NSDictionary *linkAttributes = @{
     NSForegroundColorAttributeName: [UIColor blueColor],
     NSUnderlineColorAttributeName: [UIColor redColor],
     NSUnderlineStyleAttributeName: @(NSUnderlinePatternSolid)
     };
     _textView.linkTextAttributes = linkAttributes; // customizes the appearance of links
     */
    _textView.dataDetectorTypes = UIDataDetectorTypeLink;
    _textView.attributedText = string ;
    _textView.selectable = YES; // 才能实现点击delegate
    _textView.scrollEnabled = NO;// 设置为AL后才会自动算高
    _textView.editable = NO;
    _textView.delegate = self;

实现UITextViewDelegate

- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange

以上可以看到,网络下载,@等URL就都可以实现了。但是由于APPLE 在UITextView中把很多方法都实现了,所以导致,并不能很好的控制。比如URL检测,所有的URL都会被检测出来。另外@、#等为了表现为不同的颜色,也不好控制了。另一个,我不知道怎么解决的是:当点击链接的时候,就算是手指滑出链接范围,delegate还是会触发,这个不太好。还有一种判断点击,大家可以参考

http://stackoverflow.com/questions/19332283/detecting-taps-on-attributed-text-in-a-uitextview-on-ios-7

明天准备花一天时间,结合以前写过的重新编写一次。如果有啥后续再补充。

之前写过的解析有表情,@ ## 等可以点击的URL,下面是效果图

不知道为什么底部会添加一个版权所有。我了个去~~ 随便转,不要看下面的,(但是也请注明出处).

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

时间: 2024-11-05 06:04:59

IOS7 textkit 的相关的相关文章

iOS7 滑动返回相关总结

//为了隐藏默认的返回按钮 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[UIView new]]; //开启手势操作 self.navigationController.interactivePopGestureRecognizer.delegate = nil;

iOS 技术官方 Q&A

Q: 在静态库中使用catagory分类运行时提示"selector not recognized" A: 需要配置下project/target属性 Q: 在iOS7以后怎么截图 A: iOS7 提供了相关API实现截图功能,如:-drawViewHierarchyInRect:afterScreenUpdates: iOS 技术官方 Q&A

iOS7下status bar相关问题的解决方法

转载自:http://blog.csdn.net/volcan1987/article/details/14227313 iOS7里status bar的实现跟iOS6下有写不一样,前段时间碰到了这个问题,今天总结下 首先网上有很多解决办法,但是有些我觉得并没有按照苹果的思路来,比如把UIViewControllerBasedStatusBarAppearance在plist里设置为NO的方法,这个方法的确可行,但是并不是一个“正确”的思路,而且会有些问题,比如,当你在某个界面隐藏了status

NSMutableAttributing相关 ios7升级ios8出现的问题

项目在ios7上没有问题,但是升级ios8以后,出现了不少问题,其中一个追踪到就是在NSMutableAttributing的使用上出现的问题. 项目中有个功能是:有一串字符串,对指定位置的字符设置不同的颜色,就是使用NSMutableAttributedString来实现的: NSMutableAttributedString *attibuttionStr = [[NSMutableAttributedString alloc] initWithString:str]; [attibutti

Dynamic支持CollectionView布局 、 MotionEffects特效 、 BlurImage效果 、 TextKit

1 使用UIDynamicAnimator对集合视图进行布局 1.1 问题 UIKit Dynamic动力模型一个非常有趣的用途就是影响集合视图的布局,可以给集合视图的布局添加各种动力行为,使其产生丰富多彩的效果,本案例使用UIDynamicAnimator对集合视图进行布局,实现一个弹性列表,如图-1所示: 图-1 1.2 方案 首先创建一个SingleViewApplication项目,给UIColor类创建一个分类UIColor+RandomColor,提供一个产生随机颜色的静态方法ran

TextKit 的使用----

TextKit是在iOS7中新出的,实现了对CoreText的封装,使用起来更加方便. 虽然是新出的,但也不代表立马就能上手-_-!!,TextKit可以实现图文混排效果,很好用. 1. 使用TextKit加载基本的文本 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 - (void)viewDidLoad {     [super viewDidLoad];     // 装载内容的容器     NS

ios7新特性nsurlsession初探

ios7引入了nsurlsession,通过它可以支持后台相关的网络操作的新特性.让我们看看它有哪些好处: 1.后台上传下载: 2.不需要通过nsoperation,我们用nsurlsession的api就可以做到网络操作的暂停和恢复. 3.作为可配置的容器:例如你可以设置http头的一些属性并且保存在session里,你就不用重复去做配置了:don't repeat yourself~ 4.可以子类化并支持私有的存储: 5.对鉴权的回调做了改进,此前nsurlconnection的鉴权回调无法

使用七牛云存储解决ios7.1的app部署问题

使用七牛云存储解决ios7.1的app部署问题 一.问题描述 开发完ios版本的app.需要将.ipa文件和.plist文件打包上传,供用户下载,在线安装.用户安装过程简单描述如下: 首先通过手机浏览器safari或者扫描二维码获取到下载.plist的地址.然后浏览器会自动跳转到这个地址,下载.读取.plist.(用户跳转的地址是.plist的下载地址.)这个过程,显然使用http协议来下载.plist文件.最后,iphone通过读取.plist文件中配置的.ipa下载地址,来安装.ipa文件,

iOS7,iOS8和iOS9的区别

iOS7,iOS8和iOS9的区别:iOS7.0 1.iOS 7是iOS面世以来在用户界面上做出改变最大的一个操作系统.iOS 7抛弃了以往的拟物化设计,而采用了扁平化设计. 苹果在重新思考 iOS 的设计时,更希望围绕 iOS 中深受人们喜爱的元素,打造一种更加简单实用而又妙趣横生的用户体验.最终,苹果优化了 iOS 的工作方式,并以此为基础重新设计了 iOS 的外观.之所以这样做,是因为能够服务于体验的设计才是出色的设计. 2.控制中心 控制中心为你建立起快速通路,便于你使用那些随时急需的控