我使用了四个UITextviews来放置每个段落。现在我想为每个UITextview添加一个UIButton作为子视图。
我意识到使用框架CGRectMake(textview.frame.width-50,textview.frame.height-20,50,20)
创建子视图不是一个理想的解决方案,因为句子可能在任何地方结束,我的意思是任何段落的最后一个字符可能在任何地方结束,但它的位置不是常数。
所以最重要的是,我想在UIButton
中添加UITextView
,就在lats word旁边。我该怎么做?
任何解决方案都将不胜感激。 :)
答案 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设置为单元格背景。通过这种方式,您可以轻松添加按钮。