版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.06.11 |
前言
YYText是一个专门处理文字的框架,有了它处理文字变得非常方便,这一篇我继续介绍YYText的使用方法,希望对大家能有所帮助。大家如感兴趣还可以参考:
1.YYText使用篇(一)
2.YYText使用篇(二)
3.YYText使用篇(三)
4.YYText使用篇(四)
5.YYText使用篇(五)
6.YYText使用篇(六)
7.YYText使用篇(七)
8.YYText使用篇(八)
9.YYText使用篇(九)
10.YYText使用篇(十)
下面给出的实例就是redo-undo、Ruby Annotation和AsyncExample展示。
一、YYText示例之redo-undo
下面看代码
#import "YYTextUndoRedoExample.h"
#import "YYText.h"
#import "YYImage.h"
#import "UIImage+YYWebImage.h"
#import "UIView+YYAdd.h"
#import "NSBundle+YYAdd.h"
#import "NSString+YYAdd.h"
#import "YYTextExampleHelper.h"
@interface YYTextUndoRedoExample () <YYTextViewDelegate>
@property (nonatomic, strong) YYTextView *textView;
@end
@implementation YYTextUndoRedoExample
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
NSString *text = @"You can shake the device to undo and redo.";
YYTextView *textView = [YYTextView new];
textView.text = text;
textView.font = [UIFont systemFontOfSize:17];
textView.size = self.view.size;
textView.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10);
textView.delegate = self;
textView.allowsUndoAndRedo = YES; /// Undo and Redo
textView.maximumUndoLevel = 10; /// Undo level
if (kiOS7Later) {
textView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;
}
textView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0);
textView.scrollIndicatorInsets = textView.contentInset;
[self.view addSubview:textView];
self.textView = textView;
textView.selectedRange = NSMakeRange(text.length, 0);
[textView becomeFirstResponder];
}
#pragma mark - Action && Notification
- (void)edit:(UIBarButtonItem *)item
{
if (_textView.isFirstResponder) {
[_textView resignFirstResponder];
}
else {
[_textView becomeFirstResponder];
}
}
#pragma mark - YYTextViewDelegate
- (void)textViewDidBeginEditing:(YYTextView *)textView
{
UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
target:self
action:@selector(edit:)];
self.navigationItem.rightBarButtonItem = buttonItem;
}
- (void)textViewDidEndEditing:(YYTextView *)textView
{
self.navigationItem.rightBarButtonItem = nil;
}
@end
下面看效果图
二、YYText示例之Ruby Annotation
#import "YYTextRubyExample.h"
#import "YYText.h"
#import "YYImage.h"
#import "UIImage+YYWebImage.h"
#import "UIView+YYAdd.h"
#import "NSBundle+YYAdd.h"
#import "NSString+YYAdd.h"
#import "YYTextExampleHelper.h"
/*
Ruby Annotation
See: http://www.w3.org/TR/ruby/
*/
@implementation YYTextRubyExample
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
if ([self respondsToSelector:@selector(setAutomaticallyAdjustsScrollViewInsets:)]) {
self.automaticallyAdjustsScrollViewInsets = NO;
}
NSMutableAttributedString *text = [NSMutableAttributedString new];
if (kSystemVersion < 8) {
[text yy_appendString:@"Only support iOS8 Later"];
text.yy_font = [UIFont systemFontOfSize:30];
}
else {
NSMutableAttributedString *one = [[NSMutableAttributedString alloc] initWithString:@"这是用汉语写的一段文字。"];
one.yy_font = [UIFont boldSystemFontOfSize:30];
YYTextRubyAnnotation *ruby;
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"hàn yŭ";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"汉语"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"wén";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"文"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"zì";
ruby.alignment = kCTRubyAlignmentCenter;
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"字"]];
[text appendAttributedString:one];
[text appendAttributedString:[self padding]];
one = [[NSMutableAttributedString alloc] initWithString:@"日本語で書いた作文です。"];
one.yy_font = [UIFont boldSystemFontOfSize:30];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"に";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"日"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"ほん";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"本"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"ご";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"語"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"か";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"書"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"さく";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"作"]];
ruby = [YYTextRubyAnnotation new];
ruby.textBefore = @"ぶん";
[one yy_setTextRubyAnnotation:ruby range:[one.string rangeOfString:@"文"]];
[text appendAttributedString:one];
}
YYLabel *label = [YYLabel new];
label.attributedText = text;
label.width = self.view.width - 60;
label.centerX = self.view.width / 2;
label.height = self.view.height - (kiOS7Later ? 64 : 44) - 60;
label.top = (kiOS7Later ? 64 : 0) + 30;
label.textAlignment = NSTextAlignmentCenter;
label.textVerticalAlignment = YYTextVerticalAlignmentCenter;
label.numberOfLines = 0;
label.backgroundColor = [UIColor colorWithWhite:0.933 alpha:1.000];
[self.view addSubview:label];
}
#pragma mark - Object Private Function
- (NSAttributedString *)padding
{
NSMutableAttributedString *pad = [[NSMutableAttributedString alloc] initWithString:@"\n\n"];
pad.yy_font = [UIFont systemFontOfSize:30];
return pad;
}
@end
下面看效果示意图
三、YYText示例之AsyncExample
下面看代码
#import "YYTextAsyncExample.h"
#import "YYText.h"
#import "YYImage.h"
#import "UIImage+YYWebImage.h"
#import "UIView+YYAdd.h"
#import "NSBundle+YYAdd.h"
#import "NSString+YYAdd.h"
#import "CALayer+YYAdd.h"
#import "UIControl+YYAdd.h"
#import "YYTextExampleHelper.h"
#import "YYFPSLabel.h"
#define kCellHeight 34
@interface YYTextAsyncExampleCell : UITableViewCell
@property (nonatomic, assign) BOOL async;
- (void)setAyncText:(NSAttributedString *)text;
@end
@implementation YYTextAsyncExampleCell
{
UILabel *_uiLabel;
YYLabel *_yyLabel;
}
#pragma mark - Override Base Function
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
_uiLabel = [UILabel new];
_uiLabel.font = [UIFont systemFontOfSize:8];
_uiLabel.numberOfLines = 0;
_uiLabel.size = CGSizeMake(kScreenWidth, kCellHeight);
_yyLabel = [YYLabel new];
_yyLabel.font = _uiLabel.font;
_yyLabel.numberOfLines = _uiLabel.numberOfLines;
_yyLabel.size = _uiLabel.size;
_yyLabel.displaysAsynchronously = YES; /// enable async display
_yyLabel.hidden = YES;
[self.contentView addSubview:_uiLabel];
[self.contentView addSubview:_yyLabel];
return self;
}
#pragma mark - Object Private Function
- (void)setAsync:(BOOL)async
{
if (_async == async) return;
_async = async;
_uiLabel.hidden = async;
_yyLabel.hidden = !async;
}
- (void)setAyncText:(id)text
{
if (_async) {
_yyLabel.layer.contents = nil;
_yyLabel.textLayout = text;
} else {
_uiLabel.attributedText = text;
}
}
@end
@interface YYTextAsyncExample () <UITableViewDelegate, UITableViewDataSource>
@property (nonatomic, assign) BOOL async;
@property (nonatomic, strong) NSArray *strings;
@property (nonatomic, strong) NSArray *layouts;
@property (nonatomic, strong) UITableView *tableView;
@end
@implementation YYTextAsyncExample
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView = [UITableView new];
self.tableView.frame = self.view.bounds;
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.tableView registerClass:[YYTextAsyncExampleCell class] forCellReuseIdentifier:@"id"];
[self.view addSubview:self.tableView];
NSMutableArray *strings = [NSMutableArray new];
NSMutableArray *layouts = [NSMutableArray new];
for (int i = 0; i < 300; i++) {
NSString *str = [NSString stringWithFormat:@"%d Async Display Test ✺◟(∗❛ัᴗ❛ั∗)◞✺ ✺◟(∗❛ัᴗ❛ั∗)◞✺ 😀😖😐😣😡🚖🚌🚋🎊💖💗💛💙🏨🏦🏫 Async Display Test ✺◟(∗❛ัᴗ❛ั∗)◞✺ ✺◟(∗❛ัᴗ❛ั∗)◞✺ 😀😖😐😣😡🚖🚌🚋🎊💖💗💛💙🏨🏦🏫",i];
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:str];
text.yy_font = [UIFont systemFontOfSize:10];
text.yy_lineSpacing = 0;
text.yy_strokeWidth = @(-3);
text.yy_strokeColor = [UIColor redColor];
text.yy_lineHeightMultiple = 1;
text.yy_maximumLineHeight = 12;
text.yy_minimumLineHeight = 12;
NSShadow *shadow = [NSShadow new];
shadow.shadowBlurRadius = 1;
shadow.shadowColor = [UIColor redColor];
shadow.shadowOffset = CGSizeMake(0, 1);
[strings addObject:text];
// it better to do layout in background queue...
YYTextContainer *container = [YYTextContainer containerWithSize:CGSizeMake(kScreenWidth, kCellHeight)];
YYTextLayout *layout = [YYTextLayout layoutWithContainer:container text:text];
[layouts addObject:layout];
}
self.strings = strings;
self.layouts = layouts;
UIView *toolbar;
if ([UIVisualEffectView class]) {
toolbar = [[UIVisualEffectView alloc] initWithEffect:[UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]];
} else {
toolbar = [UIToolbar new];
}
toolbar.size = CGSizeMake(kScreenWidth, 40);
toolbar.top = kiOS7Later ? 64 : 0;
[self.view addSubview:toolbar];
YYFPSLabel *fps = [YYFPSLabel new];
fps.centerY = toolbar.height / 2;
fps.left = 5;
[toolbar addSubview:fps];
UILabel *label = [UILabel new];
label.backgroundColor = [UIColor clearColor];
label.text = @"UILabel/YYLabel(Async): ";
label.font = [UIFont systemFontOfSize:14];
[label sizeToFit];
label.centerY = toolbar.height / 2;
label.left = fps.right + 10;
[toolbar addSubview:label];
UISwitch *switcher = [UISwitch new];
[switcher sizeToFit];
switcher.centerY = toolbar.height / 2;
switcher.left = label.right + (kiOS7Later ? 10 : -10);
switcher.layer.transformScale = 0.7;
__weak typeof(self) _self = self;
[switcher addBlockForControlEvents:UIControlEventValueChanged block:^(UISwitch *switcher) {
typeof(_self) self = _self;
if (!self) return;
[self setAsync:switcher.isOn];
}];
[toolbar addSubview:switcher];
}
#pragma mark - Object Private Function
- (void)setAsync:(BOOL)async
{
_async = async;
[self.tableView.visibleCells enumerateObjectsUsingBlock:^(YYTextAsyncExampleCell *cell, NSUInteger idx, BOOL *stop) {
cell.async = async;
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
if (_async) {
[cell setAyncText:_layouts[indexPath.row]];
} else {
[cell setAyncText:_strings[indexPath.row]];
}
}];
}
#pragma mark - UITableViewDelegate, UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _strings.count;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return kCellHeight;
}
- (BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath
{
return NO;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
YYTextAsyncExampleCell *cell = [tableView dequeueReusableCellWithIdentifier:@"id" forIndexPath:indexPath];
cell.async = _async;
if (_async) {
[cell setAyncText:_layouts[indexPath.row]];
} else {
[cell setAyncText:_strings[indexPath.row]];
}
return cell;
}
@end
下面看效果示意图
四、YYText示例之公用类Helper
下面还是直接看代码
1. YYTextExampleHelper.h
#import <UIKit/UIKit.h>
@interface YYTextExampleHelper : NSObject
+ (void)addDebugOptionToViewController:(UIViewController *)vc;
+ (void)setDebug:(BOOL)debug;
+ (BOOL)isDebug;
@end
2. YYTextExampleHelper.m
#import "YYTextExampleHelper.h"
#import "YYText.h"
#import "UIControl+YYAdd.h"
#import "UIView+YYAdd.h"
static BOOL DebugEnabled = NO;
@implementation YYTextExampleHelper
#pragma mark - Class Public Function
+ (void)addDebugOptionToViewController:(UIViewController *)vc
{
UISwitch *switcher = [UISwitch new];
[switcher.layer setValue:@(0.8) forKeyPath:@"transform.scale"];
[switcher setOn:DebugEnabled];
[switcher addBlockForControlEvents:UIControlEventValueChanged block:^(UISwitch *sender) {
[self setDebug:sender.isOn];
}];
UIView *view = [UIView new];
view.size = CGSizeMake(40, 44);
[view addSubview:switcher];
switcher.centerX = view.width / 2;
switcher.centerY = view.height / 2;
UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:view];
vc.navigationItem.rightBarButtonItem = item;
}
+ (void)setDebug:(BOOL)debug
{
YYTextDebugOption *debugOptions = [YYTextDebugOption new];
if (debug) {
debugOptions.baselineColor = [UIColor redColor];
debugOptions.CTFrameBorderColor = [UIColor redColor];
debugOptions.CTLineFillColor = [UIColor colorWithRed:0.000 green:0.463 blue:1.000 alpha:0.180];
debugOptions.CGGlyphBorderColor = [UIColor colorWithRed:1.000 green:0.524 blue:0.000 alpha:0.200];
} else {
[debugOptions clear];
}
[YYTextDebugOption setSharedDebugOption:debugOptions];
DebugEnabled = debug;
}
+ (BOOL)isDebug
{
return DebugEnabled;
}
@end
后记
最近的YYText的实例都展示给大家了,后面我还会继续增加自己写的工程或者demo中使用YYText的示例,有不对的地方希望大家能指正,也希望写的这些能对大家有所帮助,这里还是要致谢YYText的作者,感谢~~~