正常情况下在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];
}
}
}
理解UI界面中的空间元素结构的分布对应,下面以新闻类客户端为例进行页面元素分析2
内容过多处理方法为了让阅读更有效,可以采用不同标题规格、不同编排比例或不同色底进行层次上的划分3
模块化分割方法线条分割和空间分割的区别,分割线给人一种压迫感,而空间的分割给人更加轻松的阅读感受4
如何改变版面图版率与视觉空间比重我们来看下qq音乐会员中心页面的设计,不同的等级对应不同的颜色card,运用颜色填充背景吸引用户增加界面专属比重,起到账户切换视觉的引导作用,是一个很好的设计思路5
根据主题选择配图及配色方案我们在做设计时很多时候会去追求“高级灰”、“高逼格”亦或者是“独特性”,其实更重要的是要符合产品的调性和产品对象人群,不能一味的去追求自我的“设计追求”,比如下面的2个案例就很好的表达出了产品的调性,明确的告诉用户我是做什么产品的,为什么样的人群去服务的6
画面焦点表示在画面中相对更加突出的内容,让用户在浏览产品时能够第一视觉捕捉用户的眼球;焦点是相对的,在大页面中可以是焦点,在小模块中也可以是焦点6
1页面中焦点采用模态效果的d窗给人以不可忽视的方式出现6
2模块中的焦点我们可以看到在优酷的“我的”页面信息以卡片的形式呈现,而会员购买入口则以一种带有色彩倾向性的颜色设计,表达了其的重要性;还有优酷的首页精选的卡片中“全网独播”等角标的设计在每一个模块中都很抢眼,很容易就能够捕捉到用户的视觉重心;苹果手机自带日历中当前日期的红色选中态以绝对的焦点方式设计呈现给用户7
界面平衡平衡是版面元素上下左右比例都比较适中,给人一种稳定和平衡的视觉感受
平衡的版式设计可以让画面稳定不会产生上下比重失衡的现象,平衡的比例构图令人愉悦,而不平衡的设计会造成不稳定的分散注意力
视觉平衡是指在设计中的负元素和正元素比例相对合适,设计师的作用就是发挥元素的视觉重量的构图平衡
8
字体的选择很多时候有的设计师在做界面时候都希望全端的字体能够统一,最好的办法是嵌入文字包,但给代码包增加了负担,所以我们需要去取舍!很多国产安卓手机都有自己的系统字体,要实际调研真机效果(如差异不大非必须嵌入字体)苹果和安卓常用字体如下9
有节奏感的版式设计节奏感的设计表现形式有很多种,比较常用的是在统一的样式节奏中穿插不同的模块来使得页面的节奏感更加的跳跃和灵活,比如Medium、网易云音乐的版式设计中都运用了节奏感的设计方法跳跃的节奏感给人以活泼和时尚现代的感受,不会让画面通盘单一且枯燥的呈现给用户;灵活的节奏感也为很多付费内容提供了很好的呈现方式
不太清楚你的意思
如果想在uitextfield被点击获得焦点时捕捉这个事件,可以实现UITextfieldDelegate的相关方法,这些方法是UITextfield的事件处理函数。
如果想让通过代码让uitextfield获得焦点,调[uitextfield becomeFirstResponder]
以上就是关于如何让UITextView光标一直处于焦点状态全部的内容,包括:如何让UITextView光标一直处于焦点状态、UI界面版式设计技巧_ui界面怎么设计、ios中怎样编写当textField输入框获得输入焦点时触发一个事件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)