Peq*_*qNP 5 objective-c uitextview uitextviewdelegate ios
我一直在为iOS 7重写我的应用程序.它现在使用新的TextKit API.我差不多完成了,但是还有一个问题让我头疼,因为我已经开始进行过渡了.
问题:当我在UITextView中输入文本时,视图会向上滚动以隐藏光标.很难确定模式,但它似乎发生在我删除一行后,下面的文字必须向上移动.但是只有第二次我删除了一行而且只删除了文档中的某些行(通常是只有换行符但不总是......的行)
我尝试在stackoverflow上使用这些解决方案:
插入每个新行后UITextView继续滚动,因此行不可见(iPhone OS)
还有许多其他问题,当在UITextView中使用UITableView时,滚动无法正常工作.我认为我没有表格视图.
我想指出我已经将UITextView子类化,并发现它绝对是iOS 7调用,不仅向上滚动视图.而且,更奇怪的是,当您按下后退按钮(从UITextView中删除一个字符)时,它会发送两条消息textViewDidChangeSelection:.发生问题时,这是调用堆栈.(当问题没有发生时,我仍然得到委托的两个调用textViewDidChangeSelection:......这似乎是正常的):
textViewDidChangeSelection:包含要删除的字符的位置,长度为1.(即1050,1)textViewDidChangeSelection:再次调用UITextView委托并包含相同的位置但长度为零.(即1050,0)UITextView.scrollRangeToVisible:w/FIRST调用的范围{1050,1}.这对我来说毫无意义.我知道这是在内部调用的,而不是来自我的任何代码,因为这个内部API被调用,_ensureselectionvisible无需追溯到我可能用来调用滚动事件的函数.据推测,前两个调用只是选择字符,然后在内部调用deleteBackwards.那讲得通.不过,我之后会失明.我不知道为什么它会滚动或为什么它会调用scrollRangeToVisible:WRONG范围.
通过在用户编辑文本时UITextView.scrollRangeToVisible:返回w/o调用[super scrollRangeToVisible],我已经能够通过覆盖来缓解这个问题.我这样做是通过覆盖一些scrollview委托调用并设置一个标志,表示不能进行滚动.对我来说,这是一个巨大的UGLY黑客,在某些情况下仍然会出现问题 - 比如当我在第一次编辑时进入视图,有时当滚动视图停止减速时.
简而言之,正在发生的是滚动事件发生(可能是由于前一行向上移动)而iOS由于某种原因认为光标不在视图中.更令人好奇的是,即使提供了错误的范围,它确实提供了正确的位置,然后将其滚动到视图中的错误位置.更令人好奇的是,它只发生在某些条件下,而只发生在条件发生的第二个实例中.我唯一能想到的是,在删除文本后,UITextView的高度无法正确计算,并且它认为文本位于与实际位置不同的位置.
提前致谢!
更新:
我设置了我之前谈到过的标志scrollViewDidScroll:,它不会阻止其他情况下的跳跃.但是,仍然存在向后删除文本仍会跳转到屏幕的情况.在视图仍然跳跃的情况下,更奇怪的是我发现我[super scrollRangeToVisible]无法被调用!因此,在ADDITION内部发生了一些事情,导致视图滚动.
更新:
它似乎在613点到670点之间跳跃.我不确定是什么导致了分数差异.它跳跃的行数也有所不同.我怀疑条件之间必须有类似的东西.此外,当scrollViewDidScroll:被调用时,我验证了textView.selectedRange.location此调用和委托textViewDidChangeSelection:调用之间的相同.
这是iOS最新版本中的一个错误.希望很快就会修复,直到那时我知道唯一的选择是手动告诉UITextView在选择改变时滚动到光标位置:
// in the text view's delegate
- (void)textViewDidChangeSelection:(UITextView *)textView
{
[textView scrollRangeToVisible:textView.selectedRange];
}
Run Code Online (Sandbox Code Playgroud)
这适用于我,但也许你的应用程序的错误略有不同.不确定你应该做什么......如果你不能解决这个问题,我会向Apple提交TSI.https://developer.apple.com/support/technical/submit/