TextView - get Visible text, and how to divide string to pages?
It might make more sense to approach the problem from the other direction: You have a long String
of text. Then you decide how much you can fit on a page, and break the String
into an array of multiple substrings, one for each page. Then you can simply store a page index someplace, and use that as an index into the array of String
that you made when you broke the entire text into substrings.
This assumes that there's an algorithm to find how much text you can fit in a page. Take a look at this question.
Is it possible to know the number of visible words? not full length?
I don't know WHY you need this, but here it goes:
int start = textView.getLayout().getLineStart(0);
int end = textView.getLayout().getLineEnd(textView.getLineCount() - 1);
String displayed = textView.getText().toString().substring(start, end);
int visibleWords = displayed.split(" ").length
Get the NSRange for the visible text after scroll in UITextView
I haven't tested this thoroughly but I believe the following should work. The APIs you need are documented in the UITextInput
protocol, which UITextView
adopts.
You first need to get the UITextPosition
that corresponds to a given point inside the view. You'd then convert this value into a UTF-16 character offset. For example, here I print the visible text range (in terms of UTF-16 code units) of a textView
every time the view is scrolled:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
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)
let visibleRange = NSRange(location: charOffset, length: length)
print("Visible range: \(visibleRange)")
}
In my tests, UITextView
tended to count lines that were barely included in the visible range (e.g. by only one pixel), so the reported visible range tended to be one or two lines larger than what a human user would say. You may have to experiment with the exact CGPoint
you pass into closesPosition(to:)
to get the results you want.
Related Topics
Searchview Getactionview Returning Null
React-Native :Java.Lang.Unsatisfiedlinkerror: Couldn't Find Dso to Load: Libhermes.So
Android Notification with Buttons on It
Recyclerview Items with Big Empty Space After 23.2.0
Change Date String Format in Android
How to Apply Plugin to Only One Flavor in Gradle
Difference Between Android: and App: Prefix in Android Xml
How to Load Class Androidcomponentsextension After Upgrading the Android Gradle Plugin 7.1
How to Detect When the User Launches Another App? (Android)
Soft Keyboard Shows Up on Edittext Focus Only Once
Add an Image from Url into Custom Infowindow Google Maps V2
How to Check If Running on UI Thread in Android
Android Error - Caused By: Java.Lang.Noclassdeffounderror: Android.Support.V4.Util.Sparsearraycompat
How to Force an Intentservice to Stop Immediately with a Cancel Button from an Activity