UiTextView设置边缘排除路径后,导致所有文本消失。

5

我有一个UITextView,想要在其上添加一个自定义的UIView,并使文本在其上下流动,如下所示:

+----------------+
|------txt-------|
|                |
|     UIView     |   
|                |
|------txt-------|
|----------------|
|----------------|
+----------------+

我尝试通过添加一个排除路径来实现此目的,该路径具有 UITextView 的宽度和 UIView 的高度:

CGRect exclusionFrame=CGRectMake(0, 
                                CGRectGetMinY(element.frame),
                                self.textView.textContainer.size.width,
                                CGRectGetHeight(element.frame)); 
self.textView.textContainer.exclusionPaths=@[[UIBezierPath bezierPathWithRect:exclusionFrame]];

但是如果排除路径的宽度与 textView 的宽度相等,所有在 UIView(又名 element)下方的文本都会消失。当我将排除路径的宽度减小一个字符时,文本会出现一个字母列并排在 UiView 旁边,就像这样:

+----------------+
|------txt-------|
|a               |
|d     UIView    |   
|e               |
|------txt-------|
|----------------|
|----------------|
+----------------+

为什么我无法创建边缘到边缘的排除路径,是否有一种解决方法?

5个回答

2

我遇到了同样的问题,幸运的是我只需要插入 \n\r\n\r 就可以解决它。虽然这是一种欺骗行为,但它确实有效。


这是我目前的解决方案。难道没有更好的方法吗? - scrrr

0
最终问题出在Storyboard上。我将UiTextView从视图中取出,并以编程方式进行了初始化,这似乎解决了问题:
-(void) viewDidLoad{
    self.textView=[[UITextView alloc] init];
    self.textView.translatesAutoresizingMaskIntoConstraints=NO;
    [self.view addSubview:self.textView];

    NSDictionary* views = @{@"textView": self.textView};
    NSArray* vContrains=[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-50-[textView]-50-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:views];
    NSArray* hContrains=[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[textView]-50-|" options:NSLayoutFormatAlignAllLeft metrics:nil views:views];
    [self.view addConstraints:vContrains];
    [self.view addConstraints:hContrains];

} 

0

textView.textContainer.lineFragmentPadding = 0 textView.textContainerInset = UIEdgeInsetsZero textView.contentInset = UIEdgeInsetsZero
这些可能会有帮助。


0
如果将来有人偶然发现这个帖子:
我遇到了一个类似的错误,当使用排除路径时,我的文本消失了。我可以通过使用TextKit1而不是TextKit2来解决这个问题。
let useTextKit2 = false
let textView = UITextView(usingTextLayoutManager: useTextKit2)

然而,我无法修复单词在不考虑lineBreakMode的情况下被拆分成单个字符的错误。这似乎是TextKit的一个潜在错误。即使在苹果2022年WWDC的最新示例代码中,这个错误仍然存在: 链接到苹果关于丰富文本视图的文档

0

我用 Swift 解决了一个类似的问题,解决方案是在阅读了一个带有 switch 和 objective-c 示例的不同线程后得出的。

我有一个 UITextView,Scrolling Enabled = true。没有滚动,我没有问题,但我需要这个功能。

  1. 我使用了标准设置,启用了滚动 = true
let path = UIBezierPath(rect: myview.frame)
textView.textContainer.exclusionPaths = [path]
self.textView.addSubview(myview)
  • 当我改变UITextView的文本时,我禁用滚动
  • func setText( message: String ) {
        textView.isScrollEnabled = false
        textView.text = message
        textView.isScrollEnabled = true
    }
    

    这解决了我的问题。希望能对你有所帮助。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接