标签: textkit

从UITextView和NSLayoutManager获取行信息

为了支持该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)的内容?

objective-c nslayoutmanager ios voiceover textkit

12
推荐指数
1
解决办法
2538
查看次数

由NSStringDrawingOptions项目含义混淆

iOS7及更高版本,我们可以- (void)drawWithRect:(CGRect)rect options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context用来计算字符串大小,但我对NSStringDrawingOptions枚举上的注释感到困惑.

NSStringDrawingUsesLineFragmentOrigin

它表示指定的原点是线段碎片原点,而不是基线原点.但是线条片段起源和基线起源的含义是什么.

就像第95页上的WWDC 2013会话220(高级文本布局和带文本工具包的效果)PDF一样.

如果线段片段原点表示蓝点,那么基线来源是什么?

nsstring nsattributedstring ios textkit

11
推荐指数
1
解决办法
5847
查看次数

iOS 5/6 vs iOS 7多行标签行间距

我在iOS 7下运行我的应用程序,发现多行标签(非属性,纯文本)以小行间距呈现.任何人都知道如何使用iOS 5兼容性做到这一点?

iOS 5/6

iOS 5/6

IOS 7

IOS 7

uilabel core-text ios ios7 textkit

10
推荐指数
1
解决办法
1万
查看次数

使用NSHTMLTextDocumentType的子弹点间距和换行符开始位置

随着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)

cocoa nsattributedstring ios ios7 textkit

10
推荐指数
1
解决办法
1829
查看次数

NSTextContainer exclusionPaths冻结app并在iOS 7.1上使用99%的CPU - 解决方法?

我正在尝试使用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.0

但是,在iOS 7.1中,这将导致lineFragmentRectForProposedRect:atIndex:writingDirection:remainingRect:NSTextContainer 中的某个无限循环,使用99%的CPU并像疯狂一样泄漏内存.该应用程序完全没有响应,最终因内存使用而终止.显然这是iOS 7.1中的一个错误.

当我将排除矩形的x原点改变一个点(原点为{1,0})时,它可以工作,但看起来很糟糕:

使用iOS 7.1并向右指向一个点

只有当第一行的第一个字符受排除rect影响时,才会出现这个错误.当我将排除矩形更改为{0,30}时,它也会起作用:

iOS 7.1和0,30

但显然这不是我想要的.有谁知道如何解决这个bug?

objective-c ios nstextcontainer textkit

10
推荐指数
1
解决办法
976
查看次数

在iOS7或TextKit中使用什么而不是scrollRangeToVisible

在以前的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)

但是前者现在会产生奇怪的效果,即从长文本的顶部开始,并在每次向视图添加文本时将滚动设置为动画.当我添加文本时,有没有办法弹出文本的底部?

objective-c uitextview ios ios7 textkit

9
推荐指数
1
解决办法
3693
查看次数

UILabel的TextContainer上的排除路径

是否可以在UILabel上设置排除路径?Apple文档声明UILabel现在构建在TextKit上,但UILabel似乎没有公开textContainer属性.

我希望实现一个tableview单元格,其中包括多个标签和一个标签不应重叠的roux徽章(如下所示).

在此输入图像描述

如果使用UILabel是不可能的,我怎么能让TextView像UILabel一样(没有滚动,选择等)并调整大小以适应它的内容?

iphone objective-c uitableview ios textkit

9
推荐指数
1
解决办法
2922
查看次数

如何将UILabel的一部分直观地作为块引用?

如何使一个特定部分UILabel看起来像一个块引用,或者在文本的左侧有一条垂直线?TextKit会在这里进来吗?如果是这样,怎么样?

Mail.app执行此操作(请参阅彩色部分和侧面的行):

在此输入图像描述

如何在不使用多个UILabels的情况下复制此效果(因为我动态创建它会相当粗糙)?

cocoa-touch objective-c uilabel ios textkit

9
推荐指数
2
解决办法
989
查看次数

从XIB/Storyboard加载时替换UITextView的NSTextContainer

我已经创建了一个自定义子类NSTextStorage,它处理文本,因为我需要它来处理.

要在文本视图上使用它,我需要创建一个NSTextContainer和a NSLayoutManager,然后将容器分配给UITextView.

如果以编程方式完成,这没有任何问题.

有没有办法在从Storyboard或XIB文件加载文本视图后更改文本容器和布局管理器?

uitextview textkit

9
推荐指数
0
解决办法
317
查看次数

SwiftUI 中的富文本视图

我正在尝试在 SwiftUI 中做一个简单的笔记应用程序,我想知道是否有任何库可以提供简单的富文本视图,允许用户以粗体、斜体、删除线、下划线等书写。

我尝试过LEOTextView,但它有很多错误,我想看看是否有 100% SwiftUI 的方法来实现这一点,这样它会更容易与我的项目集成。我对 UIKit 的了解也不是很多,所以如果用 SwiftUI 制作的话,添加更多功能会更容易。

抱歉,如果这是一个愚蠢的问题,并提前致谢。

TL;DR:我只想要这样的东西 在此输入图像描述

我想这将是起点

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)

ios textkit swiftui

9
推荐指数
1
解决办法
6159
查看次数