To nie jest takie proste. Zastosowanie:
CGSize sizeOfString = [string sizeWithFont:self.aTextView.font constrainedToSize:self.aTextView.frame.size];
można uzyskać CGSize dla danego łańcucha. Ale podając cały ciąg, otrzymamy rozmiar równy rozmiarowi twojego UITextView (tak, prawy dolny róg)
Musisz użyć tej metody w ostatnim wierszu każdego UITextField ... i to jest trudna część. Zawijanie słów jest wykonywane przez CoreText, UITextView lub UILabel nie daje informacji o pojedynczych liniach, pozycjach itd.
Musisz to obliczyć samemu, wykonując coś podobnego (kod nie jest tak czysty, ja ' ll help później jeśli masz problem zrozumienia):
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];
teraz można użyć:
CGSize sizeOfString = [lastline sizeWithFont: self.aTextView.font constrainedToSize: self.aTextView.frame.size];
można uzyskać szerokość i wysokość napisu, a następnie ostateczną pozycję swojej przycisk (na stanowisko y: liczba linii pobranych z linii wysokości tablicy count * string)
EDIT: a komentarz do lewej przestrzeni w UITextView (powód dlaczego nie ma w tym wierszu -16)
CGPathAddRect(path, NULL, CGRectMake(0,0,self.aTextView.frame.size.width - 16,100000));
Zdarza się, ponieważ tekst nie jest tak naprawdę wewnątrz UITextView, ale w środku jednego z jego subviews: AN UIWebDocumentView (klasa prywatna), która dodaje wstawki. Po pewnym przeszukaniu nie mogę znaleźć żadnej metody uzyskania (legalnie) wartości tych wstawek, niezbędnych do przekazania prawidłowego rect do funkcji CGPathAddRect(). Możesz zrobić kilka testów, aby upewnić się, że zawsze jest 8pt :-) lub przejść do UILabel, które nie ma tej zawartości wstawek
Tak, nie potrzebujesz -16 jeśli używasz UILabel, nie ma margines w tym przypadku ;-) Cieszę się, że rozwiązałeś swój problem! Szczęśliwe kodowanie ;-) – LombaX