将按钮放置在UILabel / UITextView最后一个字符旁边的子视图中

时间:2013-01-16 11:23:15

标签: iphone ios objective-c uitextview

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

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

所以最重要的是,我想在UIButton中添加UITextView,就在lats word旁边。我该怎么做?

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

3 个答案:

答案 0 :(得分: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(私有类)。经过一些搜索,我找不到任何方法来获得(合法地)这个插入的值,这是将正确的rect传递给CGPathAddRect()函数所必需的。 你可以做一些测试,以确保它始终是8pt :-)或切换到UILabel,它没有内容插入

答案 1 :(得分:0)

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

UITextView在内部使用Web视图,这使得确定文本的确切布局成为一项非常重要的工作。

答案 2 :(得分:-2)

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