如何让光标在UITextView中自动可见

如何让光标在UITextView中自动可见,第1张

正常情况下在UITextView中系统会自动处理光标可见,然而实际开发中产品设计并不会局限于系统本身的空间,但作为开发者必须尽其所能的去实现,满足产品设计,达到最佳的用户体验,才能让产品有立足之地。

下面有一种情形可能是我们经常遇到的,如邮件的编辑界面。

该界面有如下控件

UITextField *toTextField // 收件人

UITextField *ccTextField// 抄送

UITextField *subjectTextField// 主题

UITextView *contentTextView// 内容

如果内容过多时,就显示不全,那么我们还必须加一个UIScrollView将上面的控件包着,支持上下滑动界面,以便查看所有内容

UIScrollView *scrollView

也许有人发现,textView本身是可以滑动的,而scrollView也可以滑动,这样会造成体验非常糟糕的结果。这种糟糕的体验起码我是决不能让其发生的,相信大家也是如此。

解决方案就是让textView的frame自适应其contentSize,然后再动态改变scrollview的contentSize,这样textview就不会独自滑动了。

上边的具体实现,相信大部分人都能知道。然后实现过的人又会遇到一个棘手的问题,内容过多时,光标不会自动向上移动,导致光标不见了。就是在这篇文章主要介绍的问题:“光标自动可见”

// 这里只介绍textview 自适应及光标自动可见的问题,所以其他的细节都省略。

#pragma mark -- KVO --

- (void)addContentView

{

contentTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 157, 320.0f, 346)]

// 设置底部间距50,这个非常重要。不加的话,会出现异常的问题,可以自己动手试一试

contentTextView.contentInset = UIEdgeInsetsMake(0, 0, 50, 0)

// 使用KVO 观察contentSize的动态

[contentTextView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]

CGSize size = scrollView.frame.size

size.height = CGRectGetMaxY(contentTextView.frame)

scrollView.contentSize = size

[scrollView addSubview: contentTextView]

}

- (void)observeValueForKeyPath:(NSString *)keyPath

ofObject:(id)object

change:(NSDictionary *)change

context:(void *)context

{

// 监听textview 的contensize是否改变

if ([keyPath isEqualToString:@"contentSize"])

{

UITextView *view = object

// 获取textView最新的contentSize的高度

CGFloat contentHeight = view.contentSize.height

CGSize scrollViewContentSize = scrollView.contentSize

if (contentHeight >346) { // 346 是textview的默认高度

CGRect frame = view.frame

frame.size.height = contentHeight + 50 // 50 是底部间距

view.frame = frame

scrollViewContentSize.height = view.frame.origin.y + view.frame.size.height

}else {

scrollViewContentSize.height = view.frame.origin.y + view.frame.size.height - 14

}

scrollView.contentSize = scrollViewContentSize

// 获取光标的位置区域

CGRect cursorPosition = [view caretRectForPosition:view.selectedTextRange.start]

// 光标相对顶层视图(scrollView)frame的坐标高度

CGFloat height = cursorPosition.origin.y + view.frame.origin.y - _mailScrollView.contentOffset.y

//

CGFloat currentPoint = cursorPosition.origin.y

// 可见scrollView区域, 由于键盘有中英输入法,所以会导致可见区域的变化

CGFloat cursorValueMax = [UIScreen mainScreen].bounds.size.height - 64 - self.keyboard.keyboardHeight

if (height >cursorValueMax - 50) { // 当光标在可见区域底部50pix内,即距离键盘50pix内

[scrollView setContentOffset:CGPointMake(0, currentPoint + view.frame.origin.y - cursorValueMax + 50) animated:YES]

} else if (height <20) { // 当光标在可见区域顶部20pix内,即距离顶部20pix内

[scrollView scrollRectToVisible:CGRectMake(0, cursorPosition.origin.y - 20, 320, 60) animated:YES]

}

}

}

android:gravity="center"是设置文字在textview当中居中,android:layout_gravity="center"是设置在父控件当中居中,你试试这样子,按钮宽度是warp

content

textview宽度是fill

content

然后权重是1

两个控件高度一致应该就可以了。

textview后面再放一个相同的button

设置为不可见。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN

| WindowManager.LayoutParams.SOFT_INPUT_ADJUST_UNSPECIFIED)其中参数可以根据个人需要调整,参数如下:

【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置

【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示

【C】stateHidden:用户选择activity时,软键盘总是被隐藏

【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的

【E】stateVisible:软键盘通常是可见的

【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态

【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示

【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间

【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11201740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存