我想在UITextView.
中有一个UIView
,为此我使用了iOS 15中引入的新NSTextAttachmentViewProvider
类。视图宽度应始终等于UITextView
的宽度,例如,当屏幕旋转时,此宽度应更新。
为了做到这一点,我使用了NSTextAttachmentViewProvider
子类中的tracksTextAttachmentViewBounds
属性。如果我理解正确的话,如果这个属性被设置为true,我的NSTextAttachmentViewProvider
子类的attachmentBounds(for:location:textContainer:proposedLineFragment:position:)
函数应该被用来确定视图的边界。在下面的代码示例中,我已经以这种方式设置了它。遗憾的是,该函数从未被调用。(情节串连图板由UIViewController
和UITextView
组成,其中四个约束(尾随、前导、底部、顶部)被设置为等于安全区域,没什么特别的)。我也尝试过使用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)
}
}
2条答案
按热度按时间myss37ts1#
现在可以在iOS16中使用。此外,
tracksTextAttachmentViewBounds = true
应该被移动到初始化程序中。whhtz7ly2#
只需将
tracksTextAttachmentViewBounds
设置器移到init
中,作为bryanboatengsuggested。attachmentBounds(for:location:textContainer:proposedLineFragment:position:)在
loadView
被调用之前被调用,因此在变量被使用之前对其进行设置是有意义的。这种行为是没有记录的,希望苹果以后会在文档中添加一些细节。
P.S.我已经在iOS 15.0模拟器中检查过了-相同的代码不起作用。这个解决方案在iOS 16下在iPhone和模拟器中都有效。