我很难为在 SwiftUI 中创建为可表示的 TextView 注入初始内容偏移量。这是 TextView 代码,后面是使用它的 ContentView。我的目标是能够将长文本视图重新定位到隐藏或关闭视图时停止的位置。
import SwiftUI
import UIKit
struct ZTextView: UIViewRepresentable
{
@Binding var text: String
func makeUIView(context: Context) -> UITextView
{
let textView = UITextView()
textView.font = UIFont.preferredFont(forTextStyle: UIFont.TextStyle.largeTitle)
textView.autocapitalizationType = .sentences
textView.isSelectable = true
textView.isUserInteractionEnabled = true
textView.delegate = context.coordinator
return textView
}
func updateUIView(_ uiView: UITextView, context: Context)
{
uiView.text = text
}
// COORDINATOR
func makeCoordinator() -> Coordinator
{
Coordinator($text)
}
class Coordinator: NSObject, UITextViewDelegate
{
var text: Binding<String>
init(_ text: Binding<String>)
{
self.text = text
}
func textViewDidChange(_ textView: UITextView)
{
self.text.wrappedValue = textView.text
print("change")
getOffset(textView)
}
func scrollViewDidScroll(_ scrollView: UIScrollView)
{
print("scroll")
}
func getOffset(_ textView: UITextView)
{
let topLeft = CGPoint(x: textView.bounds.minX, y: textView.bounds.minY)
let bottomRight = CGPoint(x: textView.bounds.maxX, y: textView.bounds.maxY)
guard let topLeftTextPosition = textView.closestPosition(to: topLeft),
let bottomRightTextPosition = textView.closestPosition(to: bottomRight)
else {
return
}
let charOffset = textView.offset(from: textView.beginningOfDocument, to: topLeftTextPosition)
let length = textView.offset(from: topLeftTextPosition, to: bottomRightTextPosition)
print("Offset: \(charOffset), Length: \(length)")
}
}
func setOffset(textview: UITextView, offset: Int)
{
let range = NSRange(location: offset, length: 1)
textview.scrollRangeToVisible(range)
}
}
内容视图代码。
import SwiftUI
struct ContentView: View
{
@State var text = "Mary\nhad\na\nlittle\nlamb\nwho's\nfleece\nwas\nwhite\nas\nsnow.\n\nEverywhere\nthat\nMary\nwent\nthe\nlamb\nwas\nsure\nto\ngo.\n"
var body: some View
{
ZTextView(text: $text)
.padding()
}
}
我一直在尝试各种可能性,但显然对 SwiftUI 的理解不足以实现这一点。我有一个类似的应用程序只使用 UIKit 工作,所以我知道它可以完成,只是现在如何或在哪里。
看来,如果我能弄清楚在哪里调用我展示的 setOffset 方法,我应该已经准备好了。有什么建议么?在 iPod Touch 模拟器上以 46 的偏移量调用它应该滚动,因此当 ZTextView 首次显示时,“as”一词位于屏幕顶部。