gpt4 book ai didi

ios - 使用 NSLayoutManager 创建动画文字效果?

转载 作者:技术小花猫 更新时间:2023-10-29 10:18:11 35 4
gpt4 key购买 nike

WWDC 2013 的第 220 节课(高级文本布局和文本工具包效果)中他们特别说NSLayoutManager可以与 NSTextStorageNSTextContainer 结合使用来创建高级文本动画。他们没有说明如何。

我想使用 NSLayoutManager/NSTextStorage/NSTextContainer 创建自定义文本动画。简而言之,我想为单个字形的大小和位置设置动画,并淡化和取消淡化特定字形。

NSLayoutManager 的动画似乎没有专门的方法或文档,我找到了关于这件事的唯一教程 is here .但是,它展示了如何将 NSLayoutManager 改造为动画,而不是如何按照预期的方式使用它(他们为创建 CATextLayer每个单独的字形!)。

有人能指出我正确的方向吗?我知道如何使用 NSLayoutManager/NSTextStorage/NSTextContainer 呈现静态文本。一些演示,展示使用 NSLayoutManager 动画文本的原理将是完美的。为了让我开始,我可以自己弄清楚细节。

最佳答案

NSTextContainer、NSLayoutManager、NSTextStorage是iOS7的新功能:

1) NSTextContainer:

The NSTextContainer class defines a region in which text is laid out. An NSTextContainer object defines rectangular regions, and you can define exclusion paths inside the textcontainer'sboundingrectanglesothattextflowsaroundtheexclusionpathasitislaidout.

2) NSLayoutManager:

An NSLayoutManager object coordinates the layout and display of characters held in an NSTextStorage object. It maps Unicode character codes to glyphs, sets the glyphs in a series of NSTextContainer objects, and displays them in a series of text view objects.

3) NSTextStorage:

NSTextStorage is a semiconcrete subclass of NSMutableAttributedString that manages a set of client NSLayoutManagerobjects,notifyingthemofanychangestoitscharactersorattributessothattheycanrelay and redisplay the text as needed.

我们可以知道NSTextStorage可以存储和管理UITextView的文本,它是NSMutableAttributedString的子类,我们可以添加或修改属性,因此它是存储和管理 UITextView 文本的不错选择。

NSLayoutManager 用于管理 NSTextStorage 布局的内容。

NSTextContainer 提供一个矩形来存储布局文本。

我们可以简单地使用它们:

CGRect textViewRect = CGRectInset(self.view.bounds, 10.0, 20.0);

// NSTextContainer
NSTextContainer *container = [[NSTextContainer alloc] initWithSize:CGSizeMake(textViewRect.size.width, CGFLOAT_MAX)]; // new in iOS 7.0
container.widthTracksTextView = YES; // Controls whether the receiveradjusts the width of its bounding rectangle when its text view is resized


// NSLayoutManager
NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; // new in iOS 7.0
[layoutManager addTextContainer:container];


// NSTextStorage subclass
self.textStorage = [[TextStorage alloc] init]; // new in iOS 7.0
[self.textStorage addLayoutManager:layoutManager];

首先是创建它们的实例,并创建它们之间的关系。您必须通过 initWithFrame:textContainer: 方法在 UITextView 中添加 NSTextContainer

// UITextView
UITextView *newTextView = [[UITextView alloc] initWithFrame:textViewRect textContainer:container];
newTextView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
newTextView.scrollEnabled = YES;
newTextView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
// newTextView.editable = NO;
newTextView.font = [UIFont fontWithName:self.textStorage.fontName size:18.0];
newTextView.dataDetectorTypes = UIDataDetectorTypeAll;
self.textView = newTextView;
[self.view addSubview:self.textView];

如果想使用UITextStorage改变文本的属性,你可以使用:

[_textStorage beginEditing];  // begin edit
[_textStorage endEditing]; // end edit

您可以在它们之间编辑文本,例如:

[_textStorage beginEditing];
NSDictionary *attrsDic = @{NSTextEffectAttributeName: NSTextEffectLetterpressStyle};
UIKIT_EXTERN NSString *const NSTextEffectAttributeName NS_AVAILABLE_IOS(7_0); // NSString, default nil: no text effect
NSMutableAttributedString *mutableAttrString = [[NSMutableAttributedString alloc] initWithString:@"Letterpress" attributes:attrsDic];
NSAttributedString *appendAttrString = [[NSAttributedString alloc] initWithString:@" Append:Letterpress"];
[mutableAttrString appendAttributedString:appendAttrString];
[_textStorage setAttributedString:mutableAttrString];
[_textStorage endEditing];

或者改变颜色:

[_textStorage beginEditing];
/* Dynamic Coloring Text */
self.textStorage.bookItem = [[BookItem alloc] initWithBookName:@"Dynamic Coloring.rtf"];
self.textStorage.tokens = @{@"Alice": @{NSForegroundColorAttributeName: [UIColor redColor]},
@"Rabbit": @{NSForegroundColorAttributeName: [UIColor greenColor]},
DefaultTokenName: @{NSForegroundColorAttributeName: [UIColor blackColor]}
};
[_textStorage setAttributedString:_textStorage.bookItem.content];
[_textStorage endEditing];

关于ios - 使用 NSLayoutManager 创建动画文字效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357193/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com