为了支持该UIAccessibilityReadingContent协议,我需要我的UITextView来回答有关其行的问题.这些是我需要实现的协议的方法:
accessibilityLineNumberForPoint: < - 提供坐标,返回行号accessibilityContentForLineNumber: < - 返回给定行的文本accessibilityFrameForLineNumber: < - 给定行号,返回其帧accessibilityPageContent< - 整个文本内容.我有.:)我认为NSLayoutManager可以帮助我,但我对它没有经验.我已经想到了一些(我认为),但仍然需要一些帮助.
Apple有一些示例代码(此处)可以获取文本视图中的行数:
NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index, numberOfGlyphs =
[layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
(void) [layoutManager lineFragmentRectForGlyphAtIndex:index
effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
Run Code Online (Sandbox Code Playgroud)
我用lineRange上面的数字来计算,我可以使用这个方法计算行数NSLayoutManager:
- (NSRect)boundingRectForGlyphRange:(NSRange)glyphRange inTextContainer:(NSTextContainer *)container
Run Code Online (Sandbox Code Playgroud)
鉴于lineRanges我应该能够计算一个点的行号(通过找到lineRange包含字形索引的行号):
- (NSUInteger)glyphIndexForPoint:(CGPoint)point inTextContainer:(NSTextContainer *)container fractionOfDistanceThroughGlyph:(CGFloat *)partialFraction
Run Code Online (Sandbox Code Playgroud)
剩下的是,如果给出行号,我如何得到一行(作为一个NSString)的内容?
iOS7及更高版本,我们可以- (void)drawWithRect:(CGRect)rect options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context用来计算字符串大小,但我对NSStringDrawingOptions枚举上的注释感到困惑.
NSStringDrawingUsesLineFragmentOrigin
它表示指定的原点是线段碎片原点,而不是基线原点.但是线条片段起源和基线起源的含义是什么.
就像第95页上的WWDC 2013会话220(高级文本布局和带文本工具包的效果)PDF一样.
如果线段片段原点表示蓝点,那么基线来源是什么?
我在iOS 7下运行我的应用程序,发现多行标签(非属性,纯文本)以小行间距呈现.任何人都知道如何使用iOS 5兼容性做到这一点?
iOS 5/6

IOS 7

随着iOS 7的到来NSHTMLTextDocumentType,我使用下面的代码来解析HTML并将其显示在一个UITextView.除了带有子弹点外,它完美无缺.
如何更改项目符号每一侧的间距(项目符号和UItextView左边框之间的空格以及项目符号右侧文本之间的空格)?
而且,更重要的是.如果文本在下一行继续,我还需要它继续在相同的x位置,如子弹点文本开始的上面的行.我怎样才能做到这一点?(二线压痕)
我尝试过使用各种各样的CSS,但似乎NSHTMLTextDocumentType仍然相当有限.我设法做的只是改变列表的颜色.
所有帮助表示赞赏.
先感谢您!
码:
_textView.textContainer.lineBreakMode = NSLineBreakByCharWrapping;
NSString *testText = @"<p><b>This is a test with:</b></p><ul><li>test test test
test test test test test test test test test test <li>test test test test test
test <li>test test test test test <li>test test test test test test test test
test test test test <li>test test test test test test test test <li>test test
test test test test <li>test test test test …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用NSTextContainer的excludePaths在UITextView中排除一个正方形,如下所示:
NSTextStorage* textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString];
NSLayoutManager *layoutManager = [NSLayoutManager new];
[textStorage addLayoutManager:layoutManager];
NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.bounds.size];
UIBezierPath *rectanglePath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 250, 250)];
textContainer.exclusionPaths = @[rectanglePath];
[layoutManager addTextContainer:textContainer];
self.textView = [[UITextView alloc] initWithFrame:self.bounds textContainer:textContainer];
self.textView.editable = NO;
self.textView.scrollEnabled = NO;
[self addSubview:self.textView];
Run Code Online (Sandbox Code Playgroud)
这适用于iOS 7.0:
但是,在iOS 7.1中,这将导致lineFragmentRectForProposedRect:atIndex:writingDirection:remainingRect:NSTextContainer 中的某个无限循环,使用99%的CPU并像疯狂一样泄漏内存.该应用程序完全没有响应,最终因内存使用而终止.显然这是iOS 7.1中的一个错误.
当我将排除矩形的x原点改变一个点(原点为{1,0})时,它可以工作,但看起来很糟糕:
只有当第一行的第一个字符受排除rect影响时,才会出现这个错误.当我将排除矩形更改为{0,30}时,它也会起作用:
但显然这不是我想要的.有谁知道如何解决这个bug?
在以前的iOS版本中,我UITextView将使用滚动到底部
[displayText scrollRangeToVisible:NSMakeRange(0,[displayText.text length])];
Run Code Online (Sandbox Code Playgroud)
要么
CGFloat topCorrect = displayText.contentSize.height -[displayText bounds].size.height;
topCorrect = (topCorrect<0.0?0.0:topCorrect);
displayText.contentOffset = (CGPoint){.x=0, .y=topCorrect};
Run Code Online (Sandbox Code Playgroud)
但是前者现在会产生奇怪的效果,即从长文本的顶部开始,并在每次向视图添加文本时将滚动设置为动画.当我添加文本时,有没有办法弹出文本的底部?
是否可以在UILabel上设置排除路径?Apple文档声明UILabel现在构建在TextKit上,但UILabel似乎没有公开textContainer属性.
我希望实现一个tableview单元格,其中包括多个标签和一个标签不应重叠的roux徽章(如下所示).

如果使用UILabel是不可能的,我怎么能让TextView像UILabel一样(没有滚动,选择等)并调整大小以适应它的内容?
如何使一个特定部分UILabel看起来像一个块引用,或者在文本的左侧有一条垂直线?TextKit会在这里进来吗?如果是这样,怎么样?
Mail.app执行此操作(请参阅彩色部分和侧面的行):

如何在不使用多个UILabels的情况下复制此效果(因为我动态创建它会相当粗糙)?
我已经创建了一个自定义子类NSTextStorage,它处理文本,因为我需要它来处理.
要在文本视图上使用它,我需要创建一个NSTextContainer和a NSLayoutManager,然后将容器分配给UITextView.
如果以编程方式完成,这没有任何问题.
有没有办法在从Storyboard或XIB文件加载文本视图后更改文本容器和布局管理器?
我正在尝试在 SwiftUI 中做一个简单的笔记应用程序,我想知道是否有任何库可以提供简单的富文本视图,允许用户以粗体、斜体、删除线、下划线等书写。
我尝试过LEOTextView,但它有很多错误,我想看看是否有 100% SwiftUI 的方法来实现这一点,这样它会更容易与我的项目集成。我对 UIKit 的了解也不是很多,所以如果用 SwiftUI 制作的话,添加更多功能会更容易。
抱歉,如果这是一个愚蠢的问题,并提前致谢。
我想这将是起点:
import SwiftUI
// first wrap a UITextView in a UIViewRepresentable
struct TextView: UIViewRepresentable {
@Binding var text: String
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
textView.delegate = context.coordinator
return textView
}
func updateUIView(_ uiView: UITextView, context: Context) {
uiView.text = text
}
class Coordinator : NSObject, UITextViewDelegate {
var parent: TextView
init(_ …Run Code Online (Sandbox Code Playgroud) textkit ×10
ios ×9
objective-c ×5
ios7 ×3
uilabel ×2
uitextview ×2
cocoa ×1
cocoa-touch ×1
core-text ×1
iphone ×1
nsstring ×1
swiftui ×1
uitableview ×1
voiceover ×1