CYRTextView
CYRTextView copied to clipboard
Making some lines of text un-editable
When the user selects a line, or tries to edit/delete text, I check the current line against a rule of mine, and use the textView delegate method shouldChangeTextInRange (returning false) to ensure that specific lines of text cannot be changed by he user. However, I have run into some issues with line numbers becoming negative and/or incorrect in the process. For example, let's say I want the last 2 lines of my textview to be un-editable, I save the total number of lines, and I fetch the current line in the shouldChangeTextInRange method. If the current line is greater-than or equal to the total number of lines-1, return false. Now, this works if I select the last two lines and try to edit, it will stop me. But if I select the line above (which happens to take up 2 lines on the device) and start deleting, the line numbers become all messed up when I start to add new lines. Here is my code:
public func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
let myCharRange = self.textView.myLayoutManager.characterRangeForGlyphRange(range, actualGlyphRange: nil)
let myParaNumber = self.textView.myLayoutManager._paraNumberForRange(myCharRange)
let myInt = self.textView.myLastLine.integerValue
if myParaNumber+1 <= 12 || Int(myParaNumber+1) >= myInt-1 {
return false
} else {
return true
}
}
Here is a sample project I made that shows the issue: https://www.dropbox.com/s/crpbw49rvv5s4q0/CYRTextView-master-2.zip?dl=0
Here are steps to reproduce on a simulator and device:
Simulator:
- Run the example (iPhone 5s) and select the line that contains the text “on one chart"
- Press enter and then use the up arrow to move the cursor up one line, you should see that the first line number is now “0”
- Now select the line that contains the text “on one chart” again, and press enter and press the up arrow key, and the line numbers will now start with -1.
Device:
- Run the example and select the line that contains the text “on one chart"
- Press enter try to enter text
- Now, tap once on the line and press “Select” from the menu that pops up, and the line numbers should now start at 0 instead of 1.
- Repeat to move into the negatives.
@illyabusigin were you able to figure this out?