iOS强大的属性文本控件 - TYAttributedLabel

ReynaldoFYY 8年前
   <h2><strong>TYAttributedLabel v2.6</strong></h2>    <p>TYAttributedLabel 简单,强大的属性文本的控件(无需了解CoreText),支持图文混排显示,支持添加链接,image和UIView控件,支持自定义排版显示</p>    <p><strong>更新:</strong></p>    <p>详细的使用请看LovePlayNews项目</p>    <p>使用autolayout 如果需要自动推断高度,必须设置preferredMaxLayoutWidth</p>    <p>添加到CocoaPods</p>    <p>v2.6 新增宽度自适应isWidthToFit,空心字设置strokeWidth,段落间距paragraphSpacing</p>    <p>v2.5 把label的一些操作移动textContainer,label只负责draw了。</p>    <p>v2.4 修复imge放大bug,新增imageAlignment 和 autolayout支持,以及相应的demo,感谢xinzhengzhang,nonstriater</p>    <p>v2.3 新增 做题demo,代码优化</p>    <p>v2.2 新增 TYImagecache类,新增 image URL 下载缓存,功能优化,改进</p>    <p>v2.1 添加 tableViewCell demo</p>    <p>v2.0 重构优化代码,性能提升,稳定(已在项目中使用), 分离出TYTextContainer ,可以提前生成,也可以生成attributedString,显著提升cell滑动场景流畅度,可以和微博一样流畅</p>    <p>v1.2 添加设置行数,修复bug,增强稳定性</p>    <p>v1.1 添加链接高亮效果,链接便利方法,长按手势代理,优化代码</p>    <h2><strong>CocoaPods</strong></h2>    <pre>  <code class="language-objectivec">pod 'TYAttributedLabel', '~> 2.6.2'</code></pre>    <h2><strong>ScreenShot</strong></h2>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b5395ce0bb9df61b6caa91813e183b89.gif"></p>    <p>新-做题demo</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/2831d0c832f28284740fc5c74e42ad47.gif"></p>    <p>weibo demo 使用TYAttributedLabel 截图</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/5c411d3571e9177a09a8dc08d28ec90b.gif"></p>    <h2><strong>Requirements</strong></h2>    <ul>     <li>Xcode 5 or higher</li>     <li>Apple LLVM compiler</li>     <li>iOS 6.0 or higher</li>     <li>ARC</li>    </ul>    <h2><strong>Features</strong></h2>    <ul>     <li>支持属性文本,图文混排显示,支持行间距 行间距 段落间距,设置行数,自适应高度,宽度</li>     <li>支持添加自定义文本属性</li>     <li>支持添加属性文本,自定义链接,新增高亮效果显示(文字和背景)</li>     <li>支持添加UIImage和UIView控件</li>    </ul>    <h2><strong>Demo</strong></h2>    <p>运行demo可以查看效果,而且在demo中,针对各种文本和图文的实现都有详细的用例,每个头文件中都有详细的用法注释,这里简单的介绍下用法</p>    <h2><strong>Usage</strong></h2>    <h3><strong>API Quickstart</strong></h3>    <ul>     <li><strong>Category And Protocol</strong></li>    </ul>    <table>     <thead>      <tr>       <th>Class</th>       <th>Function</th>      </tr>     </thead>     <tbody>      <tr>       <td>NSMutableAttributedString (TY)</td>       <td>category提供便利color,font CharacterSpacing,UnderlineStyle,ParagraphStyle的属性添加,无需了解复杂的CoreText</td>      </tr>      <tr>       <td>TYTextStorageProtocol</td>       <td>自定义文本属性 遵守最基本的协议 即可 addTextStorage 添加进去</td>      </tr>      <tr>       <td>TYAppendTextStorageProtocol</td>       <td>自定义文本属性协议 遵守即可appendTextStorage 添加进去</td>      </tr>      <tr>       <td>TYLinkStorageProtocol</td>       <td>自定义文本链接属性 继承TYAppendTextStorageProtocol</td>      </tr>      <tr>       <td>TYDrawStorageProtocol</td>       <td>自定义显示内容协议 如 UIImage UIView</td>      </tr>     </tbody>    </table>    <p>下层协议继承上层的协议,如果觉得复杂,其实我已经实现了常用的自定义属性,拿来就可以用,或者继承,添加你想要的</p>    <ul>     <li><strong>Label And Storage</strong></li>    </ul>    <table>     <thead>      <tr>       <th>Class</th>       <th>Function</th>      </tr>     </thead>     <tbody>      <tr>       <td>TYAttributedLabel</td>       <td>简单易用的属性文本,富文本的显示控件,<br> addTextStorage在已经设置文本的基础上添加属性,image或者view,<br> appendTextStorage(无需事先设置文本)直接添加属性,image或者view到最后</td>      </tr>      <tr>       <td>TYTextContainer</td>       <td>文本容器,可以提前生成,也可以生成attributedString,显著提升cell滚动流畅度</td>      </tr>      <tr>       <td>TYTextStorage</td>       <td>自定义文本属性,支持textColor,font,underLineStyle</td>      </tr>      <tr>       <td>TYLinkTextStorage</td>       <td>自定义链接属性,继承TYTextStorage,支持点击代理</td>      </tr>      <tr>       <td>TYDrawStorage</td>       <td>自定义显示内容属性,如UIImage,UIView,支持点击代理</td>      </tr>      <tr>       <td>TYImageStorage</td>       <td>自定义图片显示,继承TYDrawStorage</td>      </tr>      <tr>       <td>TYViewStorage</td>       <td>自定义UIView控件,继承TYDrawStorage</td>      </tr>      <tr>       <td>TYImageCache</td>       <td>image缓存类,支持URL请求</td>      </tr>     </tbody>    </table>    <p>如果需要更加详细的内容,请看各个头文件,有详细的注释</p>    <h3><strong>Delegate</strong></h3>    <pre>  <code class="language-objectivec">// 点击代理  - (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageClicked:(id<TYTextStorageProtocol>)textStorage atPoint:(CGPoint)point;    // 长按代理 有多个状态 begin, changes, end 都会调用,所以需要判断状态  - (void)attributedLabel:(TYAttributedLabel *)attributedLabel textStorageLongPressed:(id<TYTextStorageProtocol>)textStorage onState:(UIGestureRecognizerState)state atPoint:(CGPoint)point;</code></pre>    <h3><strong>Examples</strong></h3>    <ul>     <li> <p><strong>appendStorage demo</strong></p> </li>    </ul>    <pre>  <code class="language-objectivec">TYAttributedLabel *label = [[TYAttributedLabel alloc]init];  [self.view addSubview:label];    // 文字间隙  label.characterSpacing = 2;  // 文本行间隙  label.linesSpacing = 6;    NSString *text = @"\t总有一天你将破蛹而出,成长得比人们期待的还要美丽。\n";  [label appendText:text];    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithString:text];  [attributedString addAttributeTextColor:[UIColor blueColor]];  [attributedString addAttributeFont:[UIFont systemFontOfSize:15]];  [label appendTextAttributedString:attributedString];    [label appendImageWithName:@"CYLoLi" size:CGSizeMake(CGRectGetWidth(label.frame), 180)];    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]];  imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180);  [label appendView:imageView];    [label setFrameWithOrign:CGPointMake(0,0) Width:CGRectGetWidth(self.view.frame)];</code></pre>    <ul>     <li> <p><strong>addStorage demo</strong></p> </li>    </ul>    <pre>  <code class="language-objectivec">TYAttributedLabel *label = [[TYAttributedLabel alloc]initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.view.frame), 0)];  [self.view addSubview:label];    NSString *text = @"\t总有一天你将破蛹而出,成长得比人们期待的还要美丽。\n";  [label setText:text];    // 文字间隙  label.characterSpacing = 2;  // 文本行间隙  label.linesSpacing = 6;    textStorage = [[TYTextStorage alloc]init];  textStorage.range = [text rangeOfString:@"总有一天你将破蛹而出"];   textStorage.textColor = RGB(0, 155, 0, 1);  textStorage.font = [UIFont systemFontOfSize:18];  [label addTextStorage:textStorage];    [label addLinkWithLinkData:@"www.baidu.com" range:NSMakeRange(5, 8)];    [label addImageWithName:@"haha" range:NSMakeRange(2, 1)];    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]];  imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180);  [label addView:imageView range:NSMakeRange(16, 1)];    [label sizeToFit];</code></pre>    <ul>     <li> <p><strong>TextContainer demo</strong></p> </li>    </ul>    <pre>  <code class="language-objectivec">NSString *text = @"\t总有一天你将破蛹而出,成长得比人们期待的还要美丽。\n";  TYTextContainer *textContainer = [[TYTextContainer alloc]init];      textContainer.text = text;      // 文字间隙  textContainer.characterSpacing = 2;  // 文本行间隙  textContainer.linesSpacing = 5;    textStorage = [[TYTextStorage alloc]init];  textStorage.range = [text rangeOfString:@"总有一天你将破蛹而出"];   textStorage.textColor = RGB(0, 155, 0, 1);  textStorage.font = [UIFont systemFontOfSize:18];  [textContainer addTextStorage:textStorage];    [textContainer addLinkWithLinkData:@"www.baidu.com" range:NSMakeRange(5, 8)];    [textContainer addImageWithName:@"haha" range:NSMakeRange(2, 1)];    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"CYLoLi"]];  imageView.frame = CGRectMake(0, 0, CGRectGetWidth(label.frame), 180);  [textContainer addView:imageView range:NSMakeRange(16, 1)];      // 生成 textContainer 文本容器  [textContainer createTextContainerWithTextWidth:CGRectGetWidth(self.view.frame)];    TYAttributedLabel *label = [[TYAttributedLabel alloc]init];  label.textContainer = textContainer;      // 也可以 生成NSAttributedString 属性文本  //NSAttributedString *attString = [textContainer createAttributedString];  //label.attributedText = attString;    [label setFrameWithOrign:CGPointZero Width:CGRectGetWidth(self.view.frame)];  [self.view addSubView:label];</code></pre>    <h3><strong>Contact</strong></h3>    <p>如果你发现bug,please pull reqeust me</p>    <p>如果你有更好的改进,please pull reqeust me</p>    <p> </p>    <p> </p>