这不是那么简单。使用:
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