关于备忘录中文本线的解决方案(可计算光标坐标)

iPhone自带的备忘录软件有着不错的用户界面,那它的文本线是怎么实现的呢?不知道.知道的大神请留下解决方案.

不过几个几天的摸索,总算是想出了一条解决方案来,下面简单的描述下,希望能说的清楚.

首先我觉得需要二张图片,一张是编辑区域上面的没有横线的黄色区域,一张是编辑区域带横线的黄色区域

需要的组件有:UIScrollView一个,UIView一个,UITextView一个

叠加方式为:[UIScrollView addSubView:[UIView addSubView:UITextView]];

UIScrollView的背景设为第一张图片形式,即

_scrollView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"title.png"]];

其中_scrollView为UIScrollView,@"title.png"为第一张图片

UIView的背景设为第二张图片形式,即

_backView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"linemin.png"]];

其中_backlView为UIView,@"linemin.png"为第二张图片

UITextView的背景设为透明色

到此基本解决完毕了,但是有个问题就是默认光标被隐藏了UIScollView才会向下滑动以显示光标.

...

要实现自己控制光标的显示位置需要解决二个问题,第一是知道光标的坐标,另一个是如何无误先控制UIScollView滚动.

计算光标的坐标比较麻烦,经过几天的学习,找到了计算光标坐标的方法

下面的代码可计算出光标的y坐标(我们只要y坐标,x坐标经过一些补充也可计算出来,自己添加)

- (int)getCursorPointY:(UITextView *)curtextView
{
CGPoint cursorPoint;
int Len = curtextView.selectedRange.location;
NSString
*stringToCursor = [curtextView.text substringToIndex:Len];
NSArray
*partStrArr = [stringToCursor componentsSeparatedByString:@"\n"];
int row = [partStrArr count];
CGSize fontsize
= [@"" sizeWithFont:[curtextView font]];
for (NSString *partStr in partStrArr)
{
CGSize partStrSize
= [partStr sizeWithFont:[curtextView font] constrainedToSize:curtextView.contentSize lineBreakMode:UILineBreakModeCharacterWrap];
NSLog(
@"partStrSize.width = %f,partStrSize.height = %f",partStrSize.width,partStrSize.height);
int rowG = partStrSize.height/fontsize.height;
if (rowG >1) {
rowG
-=1;
row
+= rowG;
}

}

cursorPoint.y
= (row -1)*fontsize.height;

return (int)(cursorPoint.y);
}

到此可计算出光标Y坐标,这样用UIScollView的contentOffset设置滚动时还存在问题,就是会和默认到光标消失滚动的方法产生干扰.

我们可以通过重载UIScollView的- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;方法屏蔽默认到光标消失滚动的方法,并加入自己的控制方法.

到此,一个比较完整的解决方案产生了.

大家积极思考,看看有没有更好的解决方法.

by MAC-z

原文地址:https://www.cnblogs.com/ydhliphonedev/p/2181334.html