5

我使用了四个 UITextview 来放置每个段落。现在我想添加一个 UIButton 作为每个 UITextview 的子视图。

我意识到用框架创建子视图CGRectMake(textview.frame.width-50,textview.frame.height-20,50,20)不是一个理想的解决方案,因为句子可能在任何地方结束,我的意思是任何段落的最后一个字符可能在任何地方结束,但它的位置不是恒定的。

所以底线是,我想UIButtonUITextViewlats 单词旁边添加。我怎么做?

任何解决方案将不胜感激。:)

4

3 回答 3

5

这不是那么简单。使用:

CGSize sizeOfString = [string sizeWithFont:self.aTextView.font constrainedToSize:self.aTextView.frame.size];

您可以获得给定字符串的 CGSize。但是,给出整个字符串,将导致大小等于您的 UITextView 大小(所以,右下角)

您必须在每个 UITextField 的最后一行使用此方法......这是困难的部分。自动换行由 CoreText、UITextView 或 UILabel 完成,不会为您提供有关单行、位置等的信息。

你必须自己计算它做类似的事情(代码不是那么干净,如果你有问题理解我会在稍后提供帮助):

NSAttributedString* text = self.aTextView.attributedText;
CTFramesetterRef fs =
CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)text);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000));  // why the -16? the frame should be the REAL TEXT FRAME, not the UITextView frame. If you look, there is a space between the view margin and the text. This is the baseline. Probably there is a method to calculate it programatically, but I can't check now. In my case it seems like 8px (*2)
CTFrameRef f = CTFramesetterCreateFrame(fs, CFRangeMake(0, 0), path, NULL);
CTFrameDraw(f, NULL);

NSRange lastRange;
NSArray* lines = (__bridge NSArray*)CTFrameGetLines(f);

id lastLineInArray = [lines lastObject];
CTLineRef theLine = (__bridge CTLineRef)lastLineInArray;
CFRange range = CTLineGetStringRange(theLine);
lastRange.length = range.length;
lastRange.location = range.location - 1;
NSLog(@"%ld %ld", range.location, range.length);

CGPathRelease(path);
CFRelease(f);
CFRelease(fs);

// this is the last line
NSString *lastLine = [self.aTextView.text substringWithRange:lastRange];

现在,您可以使用:

CGSize sizeOfString = [lastLine sizeWithFont:self.aTextView.font constrainedToSize:self.aTextView.frame.size];

您将获得字符串的宽度和高度,然后是按钮的最终位置(对于 y 位置:取自行数数组的行数 * 字符串高度)

编辑:关于 UITextView 中左侧空间的评论(这行中有 -16 的原因)

CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000));

发生这种情况是因为文本实际上并不在 UITextView 内,而是在它的一个子视图内:一个 UIWebDocumentView(私有类),它添加了一个插图。经过一番搜索,我找不到任何方法来(合法地)获取此插图的值,这是将正确的矩形传递给 CGPathAddRect() 函数所必需的。您可以进行一些测试以确保它始终为 8pt :-) 或切换到没有该内容插入的 UILabel

于 2013-01-18T18:35:33.043 回答
0

您应该考虑使用 UIWebView 或一些支持此类功能的第三方属性文本视图。

UITextView 在内部使用 web 视图,这使得找出文本的确切布局成为一项不平凡的工作。

于 2013-01-16T11:36:38.043 回答
-2

我认为,使用 tableView 的更好方法。一个单元格中的一个段落。使单元格无边框并将 clearColor 设置为单元格背景。通过这种方式,您可以轻松添加按钮。

于 2013-01-18T14:19:45.980 回答