ios 轨迹文本附件视图边界不起作用

9rygscc1  于 2023-01-27  发布在  iOS
关注(0)|答案(2)|浏览(139)

我想在UITextView.中有一个UIView,为此我使用了iOS 15中引入的新NSTextAttachmentViewProvider类。视图宽度应始终等于UITextView的宽度,例如,当屏幕旋转时,此宽度应更新。
为了做到这一点,我使用了NSTextAttachmentViewProvider子类中的tracksTextAttachmentViewBounds属性。如果我理解正确的话,如果这个属性被设置为true,我的NSTextAttachmentViewProvider子类的attachmentBounds(for:location:textContainer:proposedLineFragment:position:)函数应该被用来确定视图的边界。在下面的代码示例中,我已经以这种方式设置了它。遗憾的是,该函数从未被调用。(情节串连图板由UIViewControllerUITextView组成,其中四个约束(尾随、前导、底部、顶部)被设置为等于安全区域,没什么特别的)。我也尝试过使用NSTextAttachment子类,在其中我覆盖了attachmentBounds(for:location:textContainer:proposedLineFragment:position:)函数。它也没有被调用。视图出现了,但不是我在函数中设置的宽度和高度(见下面的截图),也许它正在使用一些默认值。当我开始键入时,视图消失了。
我不知道我做错了什么。有人能帮我解决这个问题吗?

import UIKit

class SomeNSTextAttachmentViewProvider : NSTextAttachmentViewProvider {
    override func loadView() {
        super.loadView()
        tracksTextAttachmentViewBounds = true
        view = UIView()
        view!.backgroundColor = .purple
    }

    override func attachmentBounds(
        for attributes: [NSAttributedString.Key : Any],
        location: NSTextLocation,
        textContainer: NSTextContainer?,
        proposedLineFragment: CGRect,
        position: CGPoint
    ) -> CGRect {
        return CGRect(x: 0, y: 0, width: proposedLineFragment.width, height: 200)
    }
}

class ViewController: UIViewController {
    @IBOutlet var textView: UITextView?

    override func viewDidLoad() {
        super.viewDidLoad()

        NSTextAttachment.registerViewProviderClass(SomeNSTextAttachmentViewProvider.self, forFileType: "public.data")

        let mutableAttributedString = NSMutableAttributedString()
        mutableAttributedString.append(NSAttributedString("purple box: "))
        mutableAttributedString.append(
            NSAttributedString(
                attachment: NSTextAttachment(data: nil, ofType: "public.data")
            )
        )
        textView?.attributedText = mutableAttributedString
        textView?.font = UIFont.preferredFont(forTextStyle: .body)
    }
}

myss37ts

myss37ts1#

现在可以在iOS16中使用。此外,tracksTextAttachmentViewBounds = true应该被移动到初始化程序中。

whhtz7ly

whhtz7ly2#

override init(textAttachment: NSTextAttachment, parentView: UIView?, textLayoutManager: NSTextLayoutManager?, location: NSTextLocation) {
    super.init(textAttachment: textAttachment, parentView: parentView, textLayoutManager: textLayoutManager, location: location)
    tracksTextAttachmentViewBounds = true
}

只需将tracksTextAttachmentViewBounds设置器移到init中,作为bryanboatengsuggested
attachmentBounds(for:location:textContainer:proposedLineFragment:position:)loadView被调用之前被调用,因此在变量被使用之前对其进行设置是有意义的。
这种行为是没有记录的,希望苹果以后会在文档中添加一些细节。
P.S.我已经在iOS 15.0模拟器中检查过了-相同的代码不起作用。这个解决方案在iOS 16下在iPhone和模拟器中都有效。

相关问题