如何让光标在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, 3200f, 346)];

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

contentTextViewcontentInset = UIEdgeInsetsMake(0, 0, 50, 0);

// 使用KVO 观察contentSize的动态

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

CGSize size = scrollViewframesize;

sizeheight = CGRectGetMaxY(contentTextViewframe);

scrollViewcontentSize = 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 = viewcontentSizeheight;

CGSize scrollViewContentSize = scrollViewcontentSize;

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

CGRect frame = viewframe;

framesizeheight = contentHeight + 50; // 50 是底部间距

viewframe = frame;

scrollViewContentSizeheight = viewframeoriginy + viewframesizeheight;

}else {

scrollViewContentSizeheight = viewframeoriginy + viewframesizeheight - 14;

}

scrollViewcontentSize = scrollViewContentSize;

// 获取光标的位置区域

CGRect cursorPosition = [view caretRectForPosition:viewselectedTextRangestart];

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

CGFloat height = cursorPositionoriginy + viewframeoriginy - _mailScrollViewcontentOffsety;

//

CGFloat currentPoint = cursorPositionoriginy;

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

CGFloat cursorValueMax = [UIScreen mainScreen]boundssizeheight - 64 - selfkeyboardkeyboardHeight;

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

[scrollView setContentOffset:CGPointMake(0, currentPoint + viewframeoriginy - cursorValueMax + 50) animated:YES];

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

[scrollView scrollRectToVisible:CGRectMake(0, cursorPositionoriginy - 20, 320, 60) animated:YES];

}

}

}

android判断scrollview滚动到底和滚动到右的问题

第一步,获取子view的宽度

scrollview有且只有一个子view 调用 ScrollView的getChildAt方法获取子view

View view = (View) ScrollViewgetChildAt(ScrollViewgetChildCount() - 1);

子view的宽度 subViewWidth

int subViewWidth = viewgetRight();

第二步,获取scrollview的滚动位置

if(如果要判断 滚动到底){

int y = ScrollViewgetScrollY();

}else{

滚动到右

int x = ScrollViewgetScrollX();

}

第三步,判断

当subViewWidth - y - ScrollViewgetHeight() == 0则表示滚动到了最下边

当subViewWidth - x - ScrollViewgetWidth() == 0则表示滚动到了最右边

这些判断该如何触发呢,为 ScrollView设置setOnTouchListener吧

获取结果为0 ,应该是因为你在onCreat方法中获取的值,在onCreat方法回调时,

View界面还没有绘制完成,你此时获取的值当然就是0了,你可以复写下onWindowFocusChanged方法,

在该方法中进行获取,这样子拿到的值就不是0了。

为了实现webview向上滑动可以隐藏title栏,目前最简便的方法就是使用CordinatorLayout,要在CordinatorLayout中使用Webview,就必须使Webview实现NestedScrollingChild接口或者将WebView嵌套在实现了NestedScrollingChild接口的View(例如NestedScrollView,RecylerView)中。

先贴一下布局文件

此时webview的高度为当前页面全部内容的高度,由于硬件性能限制,图层绘制的高度有最大值,超过最大值会造成无法绘制图层异常,同时如果没有crash,也会因为滑动被NestedScrollView拦截无法判断内容是否滑到底部去加载更多;如果尝试在页面加载完成后重新绘制Webview的大小以避免上述异常,则会因为滑动 *** 作被NestedScrollView拦截而网页内容无法滑动,因此,Google给出的建议是不要将Webview放在NestedScrollView中。

参考: >

以上就是关于如何让光标在UITextView中自动可见全部的内容,包括:如何让光标在UITextView中自动可见、当ScrollView的滚动到底部或右边的时候监听、在CordinatorLayout中使用Webview等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10629594.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存